迁移学习之fine-tune

冒泡!小李又回来了~原来以为九月因为平台在清理可以懒一下停更…昨天发现已经可以发布了。那就九月更新一下吧…今天就叙述一下fine-tune。
——————————————————————————————————
先叙述几个概念

迁移学习

什么是迁移学习?

迁移学习就是把已训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务都是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习,使得训练成本大大下降。

迁移学习的方式

Transfer Learning:冻结预训练模型全部卷积层,只训练自己定制的全连接层。
Extract Feature Vector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。
Fine-tune:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层),训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。
其实 "Transfer Learning" 和 "Fine-tune" 并没有严格的区分,含义可以相互交换,只不过后者似乎更常用于形容迁移学习的后期微调中。


这三种迁移学习的方式都是为了让预训练模型能够胜任新数据集的识别工作,能够让预训练模型原本的特征提取能力得到充分的释放和利用。但是,在此基础上如果想让模型能够达到更低的Loss,那么光靠迁移学习是不够的,靠的更多的还是模型结构以及新数据集的丰富程度。
可参考:迁移学习实战猫狗大战

接下来具体讲一下Fine-tune.

Fine-tune

中心思想:利用原有模型的参数信息,作为我们要训练的新的模型的初始化参数,这个新的模型可以和原来一样也可以增添几个层(进行适当的调整)。
举个例子:在Alexnet的基础上,我们重新加上一个层再去训练网络,比如再加入一个全连接层,那就是先固定前面的层,让新加的fc层的loss值降低到一个很低的值,再调低学习率,放开所有层一块去训练这样可以收敛到一个不错的效果。

什么情况下可以fine-tune以及如何fine-tune?

a. 新数据集比较小且和原数据集相似,因为新数据集比较小(比如<5000),如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当作特征提取器,用提取的特征训练线性分类器。
b. 新数据集比较大且和原数据集类似(比如>10000),因为新数据集足够大,可以fine-tune微调整个网络。
c.新数据集比较小且和原数据集不相似,新数据集比较小,最好不要fine-tune。和原数据集不类似,最好也不要使用高层特征。这时,可以使用前面的特征来训练分类器。
d.新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练,但是在实践中fine-tune预训练模型还是有益的。新数据集足够大,可以fine-tine整个网络。
这边需要注意的是:网络的前几层学到的是通用的特征,后面几层学到的是与类别相关的特征。所以可以冻结去降低成本。本质上fine-tune基本思路都是一样的,就是解锁少数卷积层继续对模型进行训练。

fine-tune实践建议:

1)预训练模型的限制。使用预训练模型,受限于其网络架构。例如,不能随意从预训练模型取出卷积层。但是因为参数共享,可以输入任意大小的图像;卷积层和池化层对输入数据大小没有要求;全连接层对输入大小没有要求,输出大小固定。
2)学习率。 与重新训练相比,fine-tune要使用更小的学习率。因为训练好的网络模型权重已经平滑,我们不希望太快扭曲它们(尤其是当随机初始化线性分类器来分类预训练模型提取的特征时)。
实践详解: Caffe 使用记录(三)finetune


Ending~
今日搬砖结束!
希望感冒的小李快点好起来!
冲冲冲冲!

你可能感兴趣的:(迁移学习之fine-tune)