[DL] Transfer Learning

迁移学习

摘自: cs231n资料
问题背景:

  • 数据集不够,很难在大量数据上训练CNN网络,而且这需要大量算力资源和时间。因此,通常将在大型数据集上训练好的网络(pretrained),保存其weights。将其作为新的场景下,网络的初始参数或者是特征提取器(看作已经训练好的性能不错的特征提取器)。

三个主要应用场景:

  1. CNN作为固定的特征提取器 feature extractor。
    在原pretrained CNN基础上,仅去掉最后一层全连接层(或者更多层)(得到分类scores的一层),剩余作为feature extractor。在增加一些全连接层在新的数据集上训练。(即训练时固定feature extractor 的参数)

  2. 在第一种的基础上,对feature extractor的weights也要进行微调fine-tuning
    为了防止过拟合,可以不tuning 所有layers, 固定前几层,仅tuning后几层。(底层提取的特征更具一般性,高层提取的特征更具有具体特征,如纹理等。更关注训练的某一类的特定细节)

  3. 使用其他人开源的 pretrained models
    Caffe library: 开源pretrained models
    大佬 Ross Wightman 整理的开源pretrained models
    ONNX open neural network exchange

  • 什么时候用迁移学习?
    最重要的两个因素: 新数据集的大小(考虑过拟合,是否fine-tuning)、和原数据集的相似度(类别、图片内容)(是否fine-tuning higher layers)。

可能的四种情况:

  1. 新数据集较小,和原数据集相似。
    数据集小可能出现过拟合,相似则希望用到原模型的高层特征。在原基础上训练一个线性分类器。
  2. 新数据集较大,和原数据集相似。
    同上,且不用担心过拟合。
  3. 新数据集较小,和原数据集不相似。
    为了防止过拟合,最好只训练新的SVM;又数据集不相似,高层的特征不匹配,综合来说,在原模型的后几层早一些训练SVM。(不仅仅训练最后一层)
  4. 新数据集较大,和原数据集不相似。
    在原来模型基础上,重新 fine-tuning 整个模型参数。

实际建议: 在应用pretrained models 时,learning rate 不建议太大,因为是在原来基础上进行微调。

你可能感兴趣的:(python,深度学习,深度学习,迁移学习)