深度学习中须要大量的数据和计算资源(乞丐版都须要12G显存的GPU - -)且需花费大量时间来训练模型,但在实际中难以知足这些需求,而使用迁移学习则能有效算法
下降数据量、计算量和计算时间,并能定制在新场景的业务需求,可谓一大利器。网络
迁移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune)。经过修改预训练网络模型结构(如修改样本类别输出个数),选择性载入预训练网络模型权重(一般是载入除最后的全链接层的以前全部层 ,也叫瓶颈层)架构
再用本身的数据集从新训练模型就是微调的基本步骤。 微调可以快速训练好一个模型,用相对较小的数据量,还能达到不错的结果。机器学习
微调的具体方法和技巧有不少种,这里总结了在不一样场景下的微调技巧:学习
1)新数据集比较小且和原数据集类似。由于新数据集比较小(好比<5000),若是fine-tune可能会过拟合;又由于新旧数据集相似,咱们指望他们高层特征相似,可使用预训练网络当作特征提取器,用提取的特征训练线性分类器。blog
2)新数据集大且和原数据集类似。由于新数据集足够大(好比>10000),能够fine-tune整个网络。资源
3)新数据集小且和原数据集不类似。新数据集小,最好不要fine-tune,和原数据集不相似,最好也不使用高层特征。这时但是使用前面层的特征来训练SVM分类器。深度学习
4)新数据集大且和原数据集不类似。由于新数据集足够大,能够从新训练。可是实践中fine-tune预训练模型仍是有益的。新数据集足够大,能够fine-tine整个网络。io
fine-tune实践建议:class
1)预训练模型的限制。使用预训练模型,受限于其网络架构。例如,不能随意从预训练模型取出卷积层。可是由于参数共享,能够输入任意大小的图像;卷积层和池化层对输入数据大小没有要求;全链接层对输入大小没有要求,输出大小固定。
2)学习率。与从新训练相比,fine-tune要使用更小的学习率。由于训练好的网络模型权重已经平滑,咱们不但愿太快扭曲(distort)它们(尤为是当随机初始化线性分类器来分类预训练模型提取的特征时)。