fine-tuning是微调的意思,是用别人训练好的模型(即pre-trained model),加上我们自己的数据,来训练新的模型。fine tune相当于使用别人的模型的前几层,来提取浅层特征,然后在最后再落入我们自己的分类中。
一般来说我们自己需要做的方向,比如在一些特定的领域的识别分类中,我们很难拿到大量的数据。因为像在ImageNet上毕竟是一个千万级的图像数据库,通常我们可能只能拿到几千张或者几万张某一特定领域的图像,比如识别衣服啊、标志啊、生物种类等等。在这种情况下重新训练一个新的网络是比较复杂的,而且参数不好调整,数据量也不够,因此fine-tuning微调就是一个比较理想的选择。
如果想网络中某几层参数不变,可以设置对应learning rate为0让这些层的参数不学习
关于fine-tuning两个比较好的博客:
http://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html
http://www.cnblogs.com/alexcai/p/5469478.html
知乎上的一个问题:
https://www.zhihu.com/question/35754716
实践中总结:对于fine-tuning,网络中层的名字一模一样的会复用参数,名字不一样的会去做初始化。
对于相同的名字的层,如果输入输出与fine-tuning的不一样,就会报如下错误:
很明显,报错是shape不一样。名字相同,会认为是同一个层,但实际的输入输出又不同,即参数个数都不相同,就会报错。
对于一个网络,fine-tuning的类是21类,你的类是2类,但你的网络结构与fine-tuning的几乎一模一样,只是输出的类别数目不同,这个时候你可以保持前面几层不变,改变最后一两层的输入输出,但这时也必须同时改已经修改了输入输出个数的层的名字。名字不相同了,就不会赋值而去初始化。如果不改,相同名字的层的shape不同了,又要报错。