转载自:https://blog.csdn.net/wmz545546/article/details/77603543
- 迁移学习两种类型:
- ConvNet as fixed feature extractor:利用在大数据集(如ImageNet)上预训练过的ConvNet(如AlexNet,VGGNet),移除最后几层(一般是最后分类器),将剩下的ConvNet作为应用于新数据集的固定不变的特征提取器,输出特征称为CNN codes,如果在预训练网络上是经过ReLUd,那这些codes也要经过ReLUd(important for performance);提取出所有CNN codes之后,再基于新数据集训练一个线性分类器(Linear SVM or Softmax classifier);
- Fine-tuning the ConvNet:第一步:在新数据集上,替换预训练ConvNet顶层的分类器并retrain该分类器;第二步:以较小的学习率继续反向传播来微调预训练网络的权重,两种做法:微调ConvNet的所有层,或者保持some earlier layers fixed (due to overfitting concerns) ,只微调some higher-level portion of the network;
- 原理:一般认为CNN中前端(靠近输入图片)的层提取的是纹理、色彩等基本特征,越靠近后端,提取的特征越高级、抽象、面向具体任务。所以更普遍的微调方法是:固定其他参数不变,替换预训练网络最后几层,基于新数据集重新训练最后几层的参数(之前的层参数保持不变,作为特征提取器),之后再用较小的学习率将网络整体训练。
- 一些开源的Pretrained models:Model Zoo
- When and how to fine-tune?
- 四个主要场景:
- 新数据集小,且与原始数据集相似:要考虑小数据集过度拟合问题;利用CNN codes 训练一个线性分类器
- 新数据集大,且与原始数据集相似:不用考虑过度拟合,可尝试微调整个神经网络;
- 新数据集小,并与原始数据集差距大:训练一个线性分类器,而新数据集与原始数据集差距大,work better to train the SVM classifier from activations somewhere earlier in the network
- 新数据集大,且与原始数据集差距大,使用预训练模型参数,基于新数据集微调整个神经网络
- Practical advice
- a few additional things to keep in mind when performing Transfer Learning:
- Constraints from pretrained models:使用预训练网络,新数据集使用的架构将受限,比如不能随意take out Conv layers from the pretrained network;
- Learning rates:微调 ConvNet权重(ConvNet weights are relatively good)时的学习率要比新的线性分类器(权重是随机初始化的)的学习率要小;