【转载】DL开源框架Caffe | 模型微调 (finetune)的场景、问题、技巧以及解决方案

https://blog.csdn.net/u010402786/article/details/70141261

前言

什么是模型的微调?


使用别人训练好的网络模型进行训练,前提是必须和别人用同一个网络,因为参数是根据网络而来的。当然最后一层是可以修改的,因为我们的数据可能并没有1000类,而只有几类。把最后一层的输出类别和层的名称改一下就可以了。用别人的参数、修改后的网络和自己的数据进行训练,使得参数适应自己的数据,这样一个过程,通常称之为微调(fine tuning). 

微调时候网络参数是否更新?


更新,finetune的过程相当于继续训练,跟直接训练的区别是初始化的时候: 

a. 直接训练是按照网络定义指定的方式初始化(如高斯随机初始化) 

  b. finetune是用你已经有的参数文件来初始化(就是之前训练好的caffemodel)

**第一部分:Caffe命令行解析** —————

一、训练模型代码

  脚本:

./build/tools/caffe train-solvermodels/finetune/solver.prototxt-weightsmodels/vgg_face_caffe/VGG_FACE.caffemodel-gpu0

  BAT命令:

..\..\bin\caffe.exe train --solver=.\solver.prototxt -weights .\test.caffemodelpause

二、caffe命令全解析

http://www.cnblogs.com/denny402/p/5076285.html

第二部分:微调参数调整示例

一、各类模型finetune示例

Caffe finetune Resnet-50

http://blog.csdn.net/tangwenbo124/article/details/56070322

Caffe finetune googlenet

http://blog.csdn.net/sinat_30071459/article/details/51679995

Caffe finetune FCN

http://blog.csdn.net/zy3381/article/details/50458331

Caffe finetune Alexnet


二、参数调整注意

首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的;

调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍,目的是让非微调层学习更快;

finetune时将最后的全连接层的名字全部修改,需要根据自己数据集的类别数重新设置fc8层的output数;

数据集的类别号从0开始,中间要连续,否则会造成意外的错误

数据集记得打乱,不然很可能不收敛;

如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.01开始,如果出现loss=nan了就不断往小调整;

可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了;

finetune时应该用自己的数据集生成的均值文件(是否正确?);

第三部分:fine-tune的选择经验

在fine-tune时,究竟该选择哪种方式的Transfer Learning?需要考虑的因素有许多,其中最重要的两条是新数据库的规模和它与预训练数据库的相似程度,根据这两条因素的不同配置,存在四种场景: 


新数据库小,和预训练数据库相似。因为数据库比较小,fine-tune的话可能会产生过拟合,比较好的做法是用预训练的网络作为特征提取器,然后训练线性分类器用在新的任务上。 

新数据库比较大,和预训练数据库相似。这种情况下,不用担心过拟合,可以放心地微调整个网络。 

新数据库小,和预训练数据库不相似。这时,既不能微调,用预训练网络去掉最后一层作为特征提取器也不合适,可行的方案是用预训练网络的前面几层的激活值作为特征,然后训练线性分类器。 

新数据库大,和预训练数据库不相似。这时可以从头开始训练,也可以在预训练的基础上进行微调。 




综述:做freeze操作时,通常还会根据数据集在不同情况进行有选择的性的finetune。如small datasets时,可以freeze前面conv layer-> fc4086来提取cnn在imagenet上的多类泛化特征来辅助作为分类的feature,再对如这边revise的fc-20->softmax进行training。以此类推,如果是medium datasets则freeze到一半的conv。个人理解这样做的很大原因在于lower level layer具有更强泛化的basic feature,同时记得考量你的数据来选择。

第四部分:如何针对上述不同的方式进行网络参数固定

比如有4个全连接层A->B->C->D: 

a. 你希望C层的参数不会改变,C前面的AB层的参数也不会改变,这种情况也就是D层的梯度不往前反向传播到D层的输入blob(也就是C层的输出blob 没有得到梯度),你可以通过设置D层的lr_mult: 0,layer的梯度就不会反向传播啦,前面的所有layer的参数也就不会改变了。 

b. 你希望C层的参数不会改变,但是C前面的AB层的参数会改变,这种情况,只是固定了C层的参数,C层得到的梯度依然会反向传播给前面的B层。只需要将对应的参数blob的学习率调整为0: 

在layer里面加上param { lr_mult: 0 }就可以了,比如全连接层里面:

layer {    type:"InnerProduct"param{# 对应第1个参数blob的配置,也就是全连接层的参数矩阵的配置lr_mult:0# 学习率为0,其他参数可以看caffe.proto里面的ParamSpec这个类型}param{# 对应第2个参数blob的配置,也就是全连接层的偏置项的配置lr_mult:0# 学习率为0}}


第五部分:Caffe fine-tune常见问题

一、按照网上的教程微调alexnet,为什么loss一直是87.3365?

解决办法:检查数据集的标签是否是从0开始,base_lr调低了一个数量级,batch_size调高一倍。 


出现的原因:87.3365是个很特殊的数字,NAN经过SoftmaxWithLoss就产生了这个数字,所以就是你的FC8输出全是NAN; 


具体分析: 

http://blog.csdn.net/jkfdqjjy/article/details/52268565?locationNum=14

二、Loss下降了,但是准确率没有明显变化?

  解决办法:训练前首先shuffle,其次学习率是否合适。

三、Data augmentation 的技巧总结:

转自小白在闭关 https://www.zhihu.com/question/35339639

图像亮度、饱和度、对比度的变化; 

PCA Jittering 

Random resize 

Random crop 

Horizontal/vertical filp 

旋转仿射变换 

加高斯噪声、模糊处理 

Label shuffle:类别不平衡数据的扩增,参见海康威视ILSVRC2016的report


四、如何通过loss曲线判断网络训练的情况:

单独的 loss 曲线能提供的信息很少的,一般会结合测试机上的 accuracy 曲线来判断是否过拟合; 

关键是要看你在测试集上的acc如何; 

如果你的 learning_rate_policy 是 step 或者其他变化类型的话, loss 曲线可以帮助你选择一个比较合适的 stepsize;

五、finetune_net.bin不能用之后,用新的方法做finetune会出问题,怎么解决? 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容