迁移学习与fine-tune
1.什么是迁移学习呢?
迁移学习顾名思义就是把已经训练好的模型的参数迁移到新的模型来帮助新模型的训练。考虑到大部分的数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学习到的模型参数,通过某种方式来分享给新的模型,从而加快优化模型的学习效率不用像大多数模型那样从零开始。
2.什么是fine-tune?
fine-tune是进行迁移学习的一种手段。一般我们本身的数据集量比较小,无法重头开始训练一个效果良好的模型。于是,我们只能通过迁移学习,将一个网络,比如(VGG)前面5大层保持模型参数不变(这里的模型参数是指已经通过Imagenet数据集训练好的模型参数)。因为前面几层主要是提取图片的特征。因此,我们也可以把这几层当作特征提取器,保持原有的权重不变,提取现有的图片的特征。微调就是将调整后面的全连接层,或者最后的几个卷积层加全连接层,来实现我们想要的结果,一般根据自己要分类的类别数等等进行调整。
3.何时以及如何fine-tune?
首先要注意的是:网络的前几层学到的是通用的特征,后面几层学到的是与类别相关的特征。使用的四个场景:
a. 新数据集比较小且和原数据集相似,因为新数据集比较小,如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当作特征提取器,用提取的特征训练线性分类器。
b. 新数据集比较大且和原数据集类似,因为新数据集足够大,可以微调整个网络。
c. 新数据集比较小且和原数据集不相似,新数据集比较小,最好不要fine-tune。和原数据集不类似,最好也不要使用高层特征。这时,可以使用前面的特征来训练分类器。
d.新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练,但是在实践中fine-tune预训练的模型还是有益的,新数据集足够大,可以微调整个网络。
4.一般训练思路?
一般显示运用模型前面几层已有的参数,提取特征。然后用提取到的特征来训练我们最后的分类器。训练完毕后。最后可以根据网络来微调后面的几个卷积层以及最后的全连接层。
(1)在分类问题中,这个问题相对好理解一点,比如人脸识别中的例子,正样本很好理解,就是人脸的图片,负样本的选取就与问题场景相关,具体而言,如果你要进行教室中学生的人脸识别,那么负样本就是教室的窗子、墙等等,也就是说,不能是与你要研究的问题毫不相关的乱七八糟的场景图片,这样的负样本并没有意义;
(2)在检测的问题中,我理解着就不是那么简单了,因为检测问题需要做的事情是指出哪里有什么,也就是既要给出框,又要说明框中是什么,在这种情况下,我们所具备的数据就是一些人工标注的图片,这些图片上有框,并且会给出框中的物体类别,我们需要运用这些数据生成训练中的正负样本数据,参考了faster以及SSD两种检测框架中对于正负样本的选取准则,理解如下:
首先,检测问题中的正负样本并非人工标注的那些框框,而是程序中(网络)生成出来的框框,也就是faster rcnn中的anchor boxes以及SSD中在不同分辨率的feature map中的默认框,这些框中的一部分被选为正样本,一部分被选为负样本,另外一部分被当作背景或者不参与运算。不同的框架有不同的策略,大致都是根据IOU的值,选取个阈值范围进行判定,在训练的过程中还需要注意均衡正负样本之间的比例。