-
什么是fine-tuning:
在别人基于caffe训练好的模型(如caffenet,googlenet等)的基础上,利用别人训练好的模型的权重参数值,通过训练自己的图片集修改最后一层的(也就是softmax)的参数和输出类别,说白了就是网络层的前面层不变作为一个特征提取器,只改变最后一层作为一个分类器,最后的训练就相当于训练了一个适合自己需求的分类器。
finetune需要下面几个文件:
train_val.prototxt
deploy.prototxt(测试时用到)
solver.prototxt
caffemodel(别人训练过的)
步骤:
1.修改输入输出均值文件,若有网络名字也要修改。输入中的数据的数据格式大小也要记得修改。输出时如果最后一层不是全连接(比如:squeezenet),在最后的num_output上修改。
2.修改最后一层的名称,与修改网络名字的原理一样。因为已训练好的模型中没有与新的层进行匹配的结果,因此就会以新的随机值初始化最新创建的层。不匹配就会重新开始训练这一层,而前面的层也不会改变。
3.学习速率,由于finetune是在局部进行微调,因此学习速率base_lr不能太大,选择0.01,0.001...并且我们希望学习速率能随着迭代的次数不断降低,而且学习速率降低的幅度更快一些。这样以来,在使用step的策略时,stepsize可以更小一些。也就是运行更少的次数,降低一次lr。
4.因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。
5.train与test中的batch_size过大不修改,会出现许多Restarting data prefetching from start。跑的速度感觉也很慢,是因为自己的数据集比模型训练的数据集小得多,而我的批处理大小是相同的。因此,很明显,为了测试网络,网络必须从一开始就预先获取大量数据。但这样的话,GPU的占有率也比较高。
6.deploy.prototxt与train_val.prototxt要修改得一致。
dim: 1 num,对待识别样本进行数据增广的数量,可自行定义。一般会进行5次crop,之后分别flip。如果该值为10则表示一个样本会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1
dim: 3 通道数,表示RGB三个通道
dim: 128 图像的长和宽
参考:https://blog.csdn.net/u010402786/article/details/70141261