《Caffe windows 下进行(微调)fine-tune 模型》读书笔记

原文链接:Caffe windows 下进行(微调)fine-tune 模型

分类模型主要是针对ImageNet的数据集进行分类的,ImageNet是一个千万级的图像数据库,通常只能得到几千张或者几万张某一特定领域的图像,所以重新训练一个新的网络模型是比较复杂的,而且参数不好调整,数据量也不够,fine-tuning是一个比较理想的选择。

fine-tuning:在比人基于caffe训练好的模型的基础上,利用别人训练好的模型的权重参数值,通过训练自己的图片集,修改最后一层(即softmax)的参数和输出类别,即网络层的前面的层不变作为一个特征提取器,只改变最后一层作为一个分类器,最后的训练就相当于训练了一个适合自己需求的分类器。

微调网络,通常初始化的模型参数文件,不同于training from scratch,scrachtch指的是训练一个新的网络,在训练过程中,这些参数都被随机初始化,而fine-tuning,是可以在ImageNet上1000类分类训练好的参数的基础上,根据分类识别任务进行特定的微调。将ImageNet的输出的分类数1000,改为需求的分类数如6类图像的分类。

另外还需要将fc8层改名为自己的名字(如改为fc8-test),这样因为已训练好的模型中没有与新的层进行匹配的结果,因此就会以新的随机值初始化最新创建的层。以一个小型的网络模型CaffeNet为例,任务的变化可以表示为:

1.准备数据集

准备两个txt文件,生成list的形式。图像路径之后一个空格之后跟着类别的ID,如下,这里记住ID必须从0开始,要连续,否则会出错,loss不下降,按照要求写就OK。找了6类一共是600张图片,480张为train,120张为test,放在caffe-master/data/re/train和caffe-master/data/re/test。生成图像对应的train.txt和test.txt,接着生成对应的lmdb数据,把这些文件都放在caffe-master/examples/myfile路径下。这个是训练的图像label,测试的也同理。

2.计算数据集的均值文件

因为集中特定领域的图像均值文件会跟ImageNet上比较General的数据的均值不太一样,生成的过程可以参考之前caffe生成均值文件的步骤。最后生成的mean.binaryproto文件放在caffe-master/examples/myfile路径下。

3.调整网络层参数

参照Caffe上的例程,我用的是CaffeNet,首先在输入层data层,修改我们的source 和 meanfile, 根据之前生成的lmdb 和mean.binaryproto修改即可,最后一层的输出类别,也就是将deploy.prototxt文件中的最后的输出类别1000改为自己的输出类别,并且需要加快最后一层的参数学习速率。首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的。

调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。原来是fc8,记得把跟fc8连接的名字都要修改掉。

4.修改Solver参数

原来的参数是用来training fromscratch,从原始数据进行训练的,因此一般来说学习速率、步长、迭代次数都比较大,在fine-tuning微调只需要微微调整, 主要的调整有:test_iter从1000改为了100,因为数据量减少了,base_lr从0.01变成了0.001,这个很重要,微调时的基本学习速率不能太大,学习策略没有改变,步长从原来的100000变成了20000,最大的迭代次数也从450000变成了50000,动量和权重衰减项都没有修改,依然是GPU模型,网络模型文件和快照的路径根据自己修改

5.开始训练

首先你要从caffe zoo里面下载一下CaffeNet网络用语ImageNet1000类分类训练好的模型文件,名字是bvlc_reference_caffenet.caffemodel,这个模型可以去网上下载:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel,训练的命令如下:

Build/x64/Realse/caffe.exe train –solver=examples/myfile/solver.prototxt –weights examples/myfile/bvlc_refference_caffenet.caffemodel –gpu 0

这里将它写成一个脚本文件(xxx.sh),在cygwin下直接运行该脚本文件就行,建议大家一开始的时候可以自己多手动敲的运行,这样可以加强你的熟悉程度,后面可以写成脚本,因为写成脚本很方便,运行的时候只需要敲一行代码就行。最后达到的性能还不错accuray 是0.9,loss降的很低,finetune时应该用自己的数据集生成的均值文件。

猜你喜欢

转载自blog.csdn.net/studyeboy/article/details/68486828