用已有模型进行微调 finetune

一、 准备数据集

可以下载我的练习数据:http://pan.baidu.com/s/1MotUe,放在data/re根目录下。

这些数据共有500张图片,400张用于训练,100张用于测试。分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。

在examples/根目录下新建文件夹 mydata1,在此文件夹内放入训练集、测试集等相关文件。

1. 训练集

1)创建训练集

在examples/mydata1根目录下,新建imgtrainset文件夹 和 train.txt 文本文件

(注意: txt文件内,类别必须从0开始标注,不能从3开始)

用已有模型进行微调 finetune_第1张图片用已有模型进行微调 finetune_第2张图片

2)利用caffe现成的convert_imageset程序,把训练集从img格式转换成lmdb格式(需要归一到相同尺寸227*227),并且gray为false(caffenet网络模型输入的是三通道图片),并且需要打乱数据集(不能全0后面跟全1,再跟全2,以此类推),所以一定要加shuffle=true,不然训练的时候会出错(loss会很大)

新建convert_image_traindata.bat,内容如下:

SET GLOG_logtostderr=1

E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe imgtrainset/ train.txt train_modelre_lmdb -resize_width=227 -resize_height=227--backend=lmdb --gray=false--shuffle=true 

pause

用已有模型进行微调 finetune_第3张图片

则在examples/mydata1根目录下,就会多一个文件:train_modelre_lmdb

用已有模型进行微调 finetune_第4张图片

2. 测试集

1)创建测试集

在examples/mydata1根目录下,新建imgtestset文件夹 和 val.txt 文本文件

(同样的,txt文件内必须从0开始)

用已有模型进行微调 finetune_第5张图片

用已有模型进行微调 finetune_第6张图片

2)利用caffe现成的convert_imageset程序,把测试集从img格式转换成lmdb格式

新建convert_image_testdata.bat,内容如下:

SET GLOG_logtostderr=1
E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe imgtestset/ val.txt test_modelre_lmdb -resize_width=227 -resize_height=227 --backend=lmdb --gray=false --shuffle=true

pause

用已有模型进行微调 finetune_第7张图片

则在examples/mydata1根目录下,就会多一个文件:test_modelre_lmdb

用已有模型进行微调 finetune_第8张图片

二、 计算数据集的均值文件(均值文件只有一个(由训练集生成的))

在examples/mydata1根目录下新建image_mean_train.bat ,内容如下:

E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\compute_image_mean.exe E:\study_materials\Caffe\caffe-master\caffe-master\examples\mydata1\train_modelre_lmdb E:\study_materials\Caffe\caffe-master\caffe-master\examples\mydata1\modelre_train_mean.binaryproto --backend=lmdb

用已有模型进行微调 finetune_第9张图片

则在examples/mydata1根目录下,就会多一个文件:modelre_train_mean.binaryproto

三、 修改网络(调整网络层参数)

我们使用位于models/下的bvlc_reference_caffenet网络,把solver.prototxt和train_val.prototxt拷贝到examples/mydata1根目录下,然后再进行修改

修改train_val.prototxt文件内容

1.训练部分修改 (因为训练集不多,所以batch_size可以设置为1,不过训练会比较慢)

用已有模型进行微调 finetune_第10张图片

2.测试部分修改

用已有模型进行微调 finetune_第11张图片

3.fc8层修改(修改名字之后,这样预训练模型赋值的时候这里就会因为名字不匹配从而自动的进行重新训练)

用已有模型进行微调 finetune_第12张图片

四、 修改Solver参数

修改solver.prototxt文件内容

从原始数据进行训练的,因此一般来说学习速率、步长、迭代次数都比较大,在fine-tuning微调呢,也正如它的名字,只需要微微调整, 主要的调整有:
  1. test_iter从1000改为了5(因为我用的测试集很少,每一类一个,一共5个,而batch_size我设置了1,所以5/1=5),因为数据量减少了。
  2. base_lr从0.01变成了0.0001(一开始我设置了0.001,一直出现loss=1.#QUAN的情况),这个很重要,微调时的基本学习速率不能太大。
  3. 学习策略lr_policy没有改变(依旧为step)。
  4. 步长stepsize从原来的100000变成了200。
  5. 最大的迭代次数max_iter也从450000变成了1000。
  6. test_intervalsnapshot则根据自己的喜好设置,一个是设置多少次输出accuracy;一个是设置多少次输出一次caffemodel和solverstate。

参考资料:

http://blog.csdn.net/helloworldding/article/details/76559855

https://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html

用已有模型进行微调 finetune_第13张图片

参数设置说明

1.训练样本
总共:25个
batch_size:1
将所有样本处理完一次(称为一代,即epoch)需要:25/1=25 次迭代才能完成
所以这里将test_interval设置为25,即处理完一次所有的训练数据后,才去进行测试。所以这个数要大于等于25.
如果想训练40代,则最大迭代次数为1000;
2.测试样本
同理,有5个测试样本,batch_size为1,那么需要5次才能完整的测试一次。 所以test_iter为5;这个数要大于等于5.
3.学习率

学习率变化规律我们设置为随着迭代次数的增加,慢慢变低。总共迭代1000次,我们将变化5次,所以stepsize设置为1000/5=200,即每迭代200次,我们就降低一次学习率。

4. Step 学习策略

用已有模型进行微调 finetune_第14张图片

(注:stepsize不能太小,如果太小会导致学习率再后来越来越小,达不到充分收敛的效果)

五、 启动训练,加载预训练模型微调

在examples/mydata1根目录下新建文件夹 train_re_finetune.bat,内容如下:
E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\caffe.exe 
train -solver solver.prototxt -weights bvlc_reference_caffenet.caffemodel 
2>&1 | tee train_re.log
pause

用已有模型进行微调 finetune_第15张图片
双击文件后,运行结果如下图,信息存在了train_re.log文件中

用已有模型进行微调 finetune_第16张图片

用已有模型进行微调 finetune_第17张图片

你可能感兴趣的:(用已有模型进行微调 finetune)