深度学习笔记(31) 迁移与增强

深度学习笔记(31) 迁移与增强

  • 1. 迁移学习
  • 2. 大训练集的迁移学习
  • 3. 迁移规律
  • 4. 数据增强


1. 迁移学习

如果要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始
如果下载别人已经训练好网络结构的权重,通常能够进展的相当快
用这个作为预训练,再转换到感兴趣的任务上
用迁移学习把公共的数据集的知识迁移到自己的问题上

举个例子,假如说要建立一个猫咪检测器,用来检测宠物猫
假如两只猫叫Tigger和Misty,还有一种情况是,两者都不是
所以现在有一个三分类问题,图片里是Tigger还是Misty,或者都不是
忽略两只猫同时出现在一张图片里的情况

在这里插入图片描述
现在可能没有Tigger或者Misty的大量的图片,所以训练集会很小
建议从网上下载一些神经网络开源的实现,不仅把代码下载下来,也把权重下载下来

举个例子,ImageNet数据集,它有1000个不同的类别
因此这个网络会有一个Softmax单元,它可以输出1000个可能类别之一
可以去掉这个Softmax层,创建自己的Softmax单元
用来输出Tigger、Misty和neither三个类别
深度学习笔记(31) 迁移与增强_第1张图片

就网络而言,建议把所有的层看作是冻结的,冻结网络中所有层的参数
只需要训练和Softmax层有关的参数
通过使用其他人预训练的权重,很可能得到很好的性能,即使只有一个小的数据集

事实上,取决于用的框架,它也许会有trainableParameter=0这样的参数
对于这些前面的层,可能会设置这个参数
为了不训练这些权重,有时也会有freeze=1这样的参数
不同的深度学习编程框架有不同的方式,允许指定是否训练特定层的权重
在这个例子中,只需要训练softmax层的权重,把前面这些层的权重都冻结
深度学习笔记(31) 迁移与增强_第2张图片
另一个技巧,也许对一些情况有用
由于前面的层都冻结了,相当于一个固定的函数,不需要改变
因为不需要改变它,也不训练它
取输入图像X,然后把它映射到这层(softmax的前一层)的激活函数
所以这个能加速训练的技巧就是,如果先计算这一层,计算特征或者激活值
然后把它们存到硬盘里,然后在此之上训练softmax分类器

深度学习笔记(31) 迁移与增强_第3张图片
所以,存储到硬盘或者说预计算方法的优点就是
不需要每次遍历训练集再重新计算这个激活值了
因此如果任务只有一个很小的数据集,可以这样做


2. 大训练集的迁移学习

如果要有一个更大的训练集
这种情况,应该冻结更少的层,然后训练后面的层
如果输出层的类别不同,那么需要构建自己的输出单元,Tigger、Misty或者两者都不是三个类别
有很多方式可以实现,可以取后面几层的权重,用作初始化,然后梯度下降
在这里插入图片描述
或者可以直接去掉最后几层,换成自己的隐藏单元和自己的softmax输出层,这些方法值得一试
深度学习笔记(31) 迁移与增强_第4张图片


3. 迁移规律

有一个规律,如果有越来越多的数据需要冻结的层数越少,能够训练的层数就越多
如果有一个更大的数据集,也许有足够多的数据,那么不要单单训练一个softmax单元
而是考虑训练中等大小的网络,包含最终要用的网络的后面几层
极端情况下,可以用下载的权重只作为初始化,用它们来代替随机初始化
接着可以用梯度下降训练,更新网络所有层的所有权重


4. 数据增强

当下在计算机视觉方面,计算机视觉的主要问题是没有办法得到充足的数据
简单的数据增强方法:

  1. 垂直镜像对称
    深度学习笔记(31) 迁移与增强_第5张图片
  2. 随机裁剪
    深度学习笔记(31) 迁移与增强_第6张图片
  3. 旋转
    深度学习笔记(31) 迁移与增强_第7张图片
  4. 扭曲
  5. 彩色转换
    深度学习笔记(31) 迁移与增强_第8张图片

常用的实现数据增强的方法是使用一个线程或者是多线程
这些可以用来加载数据,实现变形失真
然后传给其他的线程或者其他进程来训练,可以并行实现


参考:

《神经网络和深度学习》视频课程


相关推荐:

深度学习笔记(30) Inception网络
深度学习笔记(29) 1×1 卷积
深度学习笔记(28) 残差网络
深度学习笔记(27) 经典卷积网络
深度学习笔记(26) 卷积神经网络


谢谢!

你可能感兴趣的:(深度学习笔记)