什么是fine-tuning?简单举一个本人的例子来说明
我有两种类型的数据集,一种命名为style1,另一种为style2,两种数据集类型(也就是label)一致,但是数据却采集于不同的地方,比如佛经的手写文字和《黄帝内经》的手写文字。现在我基于style1的数据集上训练出一个识别模型,然后用这个识别模型对style2进行验证,若是两者之间的差异性很大,那么得到的验证准确率定然非常低。这个时候就要对这个识别模型进行fine-tuning,就是微调的意思。
上面就是举一个我自己的例子
下面就来自于其他人的讲述*
在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器。
看不懂的没有关系,你就理解为在训练之前的预训练阶段吧。
何时以及如何Fine-tune*
决定如何使用迁移学习的因素有很多,这是最重要的只有两个:新数据集的大小、以及新数据和原数据集的相似程度。有一点一定记住:网络前几层学到的是通用特征,后面几层学到的是与类别相关的特征。这里有使用的四个场景:
1.新数据集比较小且和原数据集相似。因为新数据集比较小,如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当做特征提取器,用提取的特征训练线性分类器。
2.新数据集大且和原数据集相似。因为新数据集足够大,可以fine-tune整个网络。
3.新数据集小且和原数据集不相似。新数据集小,最好不要fine-tune,和原数据集不类似,最好也不使用高层特征。这时可是使用前面层的特征来训练SVM分类器。
4.新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练。但是实践中fine-tune预训练模型还是有益的。新数据集足够大,可以fine-tine整个网络。
概念讲完|学习如何实践
首先你要确定数据集两者必须存在一定的关联性,不能一套文字pic和一套人脸pic,当然这都是开玩笑,毕竟深度学习网络深不可测,说不定没有任何关联性的数据集也就是可以呢,咱也不敢问反正。
接下来就是去预训练模型,训练之后不可以随意从预训练模型中取出卷积层等,最要是在原有网络基础上直接进行训练。
最后要提一下最关键的部分,就是学习率的调整, 因为预训练好的模型已经很平滑了,权重基本上达到了一个极值,所以在最好使用更小的学习率。
总之就是,不要动网络结构,因为你训练好的参数就是对照着你之前的网络的,然后降低一下自己的学习率,具体多少可以看心情,反正我是(lr*0.01),然后开始训练另外一个数据集,perfect!
总结
可能我说的不是很严谨,但是so?
(带*的是拿别人的,有问题你找这个人,跟我没关系,我就是来学习的:https://blog.csdn.net/weixin_42137700/article/details/82107208)