日常的应用中,我们会很经常遇到一个问题:
如何应用强大的model(比如ResNet)去训练我们自己的数据?
考虑到这样的几个事实:
解决方法就是fine-tuning
.
参考CS231的资料,有三种方式
考虑两个问题:
分为四种情况,解决方法基于的原则就是:
NN中的低层特征是比较generic的,比如说线、边缘的信息,高层特征是Dataset Specific的,基于此,如果你的数据集和ImageNet差异比较大,这个时候你应该尽可能的少用pre-trained model的高层特征.
从上面我们可以看出,数据集大有优势,否则最好是数据集和原始的相似度比较高;如果出现数据集小同时相似度低的情况,这个时候去fine-tuning后几层未必会有比较好的效果.
Caffe做fine-tuning相对tensorflow很简单,只需要简单修改下配置文件就行了.
此处假设你的数据集比较小,同时相似度比较高,仅需重新训练最后一层(fc)的情况.
(1) 降低solver中lr和stepsize
这个很明显,因为相似度比较高我们可以期望原始获得的feature和需要的是很接近的,此时需要降低学习率(lr)和迭代次数(stepsize).
(2) 修改最后一层fc的名字,设置好lr_mult
应为需要训练最后一层,我们把之前的层的学习率设置的很低(比如0.001),或者你干脆设置为0,最后一层设置一定的学习率(比如0.01),所以需要乘以10.
(3) 训练
其实就已经改好了,是不是很简单,按照之前标准化的训练测试就好了
知乎上fine-tuning的介绍上有更加详细的介绍,可以移步去看.
参考
(1) NodYoung的博客