cs231n : Transfer Learning

所谓Transfering learning

实际上,很少人会从头开始训练一个完整的卷积神经网络(而且初始化是随机的),因为拥有足够多的数据集的概率是很小的。相反,通常的做法是在一个很大的数据集,比如ImageNet(包含1000个类别的1.2m张图片)上预训练,然后将这个卷积神经网络作为我们感兴趣的任务的初始化或者固定特征提取器。迁移学习的三个主要场景如下:

1. 卷积神经网络作为特征提取器
获取一个在ImageNet上预训练好的卷积神经网络,移除它最后的全连接层(这一层的输出是1000个类别的得分),然后将剩余的卷积神经网络看做新数据集的固定特征提取器。在AlexNet中,这个特征提取器会对每张图片计算出一个4096维的向量,这个向量包含最后一个分类器之前的隐藏层的激活函数的输出。我们将这些特征称为CNN codes。如果这些code当在ImageNet数据及上进行训练时被threshholded了,那么这些code被ReLUd对于神经网络的表现而言是很重要的。一旦提取出了所有图片的4096维的codes之后,我们就可以在新的数据集上训练一个线性分类器了。

2. Finetune卷积神经网络
第二种策略是不仅仅在新的数据集上对于神经网络的最后一个卷积层的分类器进行替换和重新训练,而且是通过继续bp过程对预训练的网络的权重你进行fine-tune。我们可以对卷积神经网络的所有层都进行fine-tune,或者保持前面的层的参数固定(考虑到过拟合的问题),只调整神经网络的最后一些层。这样做的原因主要是我们观察到神经网络的前面的层的特征包含更多的属性特征(比如角检测器或者color blob检测器),而这些对于很多任务都是有用的,但是神经网络后面的层变得越来越有特殊性(即只针对原始数据集)。就拿ImageNet来说,这个数据集包括很多类别的狗狗,因此这个网络有能力识别很多不同种类的狗狗。

3. 预训练模型
由于在ImageNet上进行多GPU训练可能花费2-3个星期,因此更一般的做法是公开自己最终的神经网络的checkpoints,这样其他人就可以用这个进行fine-tune。比如,caffe library就有一个Model Zoo,人们可以在那里分享他们自己的网络参数。


何时、如何进行fine-tune?
如何决定在一个新的数据集上进行哪种类型的迁移学习呢?其中最重要的两个决定因素是新数据集的大小以及它同原始数据集之间的相似性。以下是一些common rules of thumb:
1)新数据集比较小并且同原始数据集相似,选择train a linear classifier on the CNN codes.
2)新数据集比较大并且同原始数据集相似,can have more confidence that we won’t overfit if we were to try to fine-tune through the full network;
3)新数据集比较小并且同原始数据集不太相似,to only train a linear classifier,from activations somewhere earlier in the network;
4)新数据集比较大并且同原始数据集不太相似,we would have enough data and confidence to fine-tune through the entire network.


Practical advice
1. 使用预训练模型的话,对于新数据集可选择的结构就会受到限制。比如,你不能从预训练模型中随意拿走一些卷积层。
2. 学习率一般设定的比较小。这是因为我们一般不太希望对卷积神经网络的参数distort得太快、太多。

猜你喜欢

转载自blog.csdn.net/weixin_40516558/article/details/80179058