转自http://www.javashuo.com/article/p-zfjjhdmp-cr.html网络
在实践中,因为数据集不够大,不多有人从头开始训练网络。常见的作法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来从新fine-tuning(也叫微调),或者当作特征提取器。架构
如下是常见的两类迁移学习场景:ide
1 卷积网络当作特征提取器。使用在ImageNet上预训练的网络,去掉最后的全链接层,剩余部分当作特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量)。这样提取的特征叫作CNN codes。获得这样的特征后,可使用线性分类器(Liner SVM、Softmax等)来分类图像。学习
2 Fine-tuning卷积网络。替换掉网络的输入层(数据),使用新的数据继续训练。Fine-tune时能够选择fine-tune所有层或部分层。一般,前面的层提取的是图像的通用特征(generic features)(例如边缘检测,色彩检测),这些特征对许多任务都有用。后面的层提取的是与特定类别有关的特征,所以fine-tune时经常只须要Fine-tuning后面的层。spa
预训练模型.net
在ImageNet上训练一个网络,即便使用多GPU也要花费很长时间。所以人们一般共享他们预训练好的网络,这样有利于其余人再去使用。例如,Caffe有预训练好的网络地址Model Zoo。code
什么时候以及如何Fine-tuneblog
决定如何使用迁移学习的因素有不少,这是最重要的只有两个:新数据集的大小、以及新数据和原数据集的类似程度。有一点必定记住:网络前几层学到的是通用特征,后面几层学到的是与类别相关的特征。这里有使用的四个场景:get
一、新数据集比较小且和原数据集类似。由于新数据集比较小,若是fine-tune可能会过拟合;又由于新旧数据集相似,咱们指望他们高层特征相似,可使用预训练网络当作特征提取器,用提取的特征训练线性分类器。it
二、新数据集大且和原数据集类似。由于新数据集足够大,能够fine-tune整个网络。
三、新数据集小且和原数据集不类似。新数据集小,最好不要fine-tune,和原数据集不相似,最好也不使用高层特征。这时但是使用前面层的特征来训练SVM分类器。
四、新数据集大且和原数据集不类似。由于新数据集足够大,能够从新训练。可是实践中fine-tune预训练模型仍是有益的。新数据集足够大,能够fine-tine整个网络。
实践建议
预训练模型的限制。使用预训练模型,受限于其网络架构。例如,你不能随意从预训练模型取出卷积层。可是由于参数共享,能够输入任意大小图像;卷积层和池化层对输入数据大小没有要求(只要步长stride fit),其输出大小和属于大小相关;全链接层对输入大小没有要求,输出大小固定。(总感受哪边不对)
学习率。与从新训练相比,fine-tune要使用更小的学习率。由于训练好的网络模型权重已经平滑,咱们不但愿太快扭曲(distort)它们(尤为是当随机初始化线性分类器来分类预训练模型提取的特征时)。