参考1:https://blog.csdn.net/zhouzhouzf/article/details/53188296
参考2:https://www.cnblogs.com/xuanyuyt/p/6062204.html
文章目录
1、选择合适的model
- 下载预训练的models,以及相应的deploy和solver等prototxt
- 下载mean image,注prototxt相应的位置可以修改mean_file的路径
2、数据集准备
把数据集分成两部分,train和test
3、数据集预处理
将图片resize成网络所需的size,例如227*227
3.1、数据集label文件生成(标签文件.txt文件制作)
把自己的数据及对应的label写进一个txt中,作为下一步工作的输入。
3.2、将自己的图片数据集转换成lmdb(生成lmdb数据)
Caffe支持三种数据格式,LMDB,leveldb以及最原始的image格式。
参考:examples/imagenet/create_imagenet.sh
$ GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle=true \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb
其中,test_lmdb表示生成的LMDB名字,当转换训练数据时,改成train_lmdb,-shuffle true表示是否进行打乱的操作,这样生成两个文件,其中每个文件包含两个文件data.mdb、lock.mdb。查看data.mdb文件大小,如果只有几K,说明没打包成功,查看路径设置有没有问题。
3.3、计算数据集的mean image
在caffe后面进行training阶段,会把每个数据图片减去这个mean image,可以达到去除背景的功能。
参考:./examples/imagenet/make_imagenet_mean.sh生成.binaryproto格式文件。
EXAMPLE=examples/imagenet
DATA=data/ilsvrc12
TOOLS=build/tools
$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
$DATA/imagenet_mean.binaryproto
echo "Done."
:'
例如:$ /home/xu/caffe/build/tools/compute_image_mean \
/home/xu/caffe/data/mydata/train_lmdb \
/home/xu/caffe/data/mydata/image_mean.binaryproto
'
求出的结果保存在一个二进制文件中
4、finetune
使用如下指令完成finetune
$ ./build/tools/caffe train --solver ./models/bvlc_reference_caffenet/solver.prototxt
--weights ./models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel --gpu 0
#当数据量大,时间相对较长,可使用nohup命令通过后台运行,输出会定向到nohup.out文件中,可以查看此文件模型训练情况
$ nohup ./build/tools/caffe train --solver ./models/bvlc_reference_caffenet/solver.prototxt
--weights ./models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel --gpu 0
#查看GPU是否被占用以及占用的内存大小命令
$ nvidia-smi
如果不指定–weights ./models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel命令,我们进行的就是利用自己的数据集以及给定的网络结构,生成自己的网络权重。两者之间的差距就是网络权重初始化的区别。finetune的网络权重的初始化是利用已有的caffemodel进行初始化我们网络的权重,而不加weight的意思就是随机初始化整个网络的权重,重头开始train一个新的每层权重。
4.1、调整网络参数
- prototxt文件中的data层,修改source和meanfile,根据自己的lmdb和mean.binaryproto修改。
- prototxt文件中的输出层fc8,首先修改名字(注意Accuracy层和Loss层相应的fc8名字也要修改),这样预训练模型赋值的时候不会因为名字不匹配从而重新训练。调整学习率,因为最后一层是重新学习,因此需要有更快的学习速率相较于其它层,因此将weight和bias的学习速率加快10倍。
4.2、修改solver参数
主要的调整有:test_iter从1000改为了100,因为数据量减少了,base_lr从0.01变成了0.001,这个很重要,微调时的基本学习速率不能太大,学习策略没有改变,步长从原来的100000变成了20000,最大的迭代次数也从450000变成了50000,动量和权重衰减项都没有修改,依然是GPU模型,网络模型文件和快照的路径根据自己修改
5、done
5.1、查看loss
运行train时shell界面出现的信息,可以在train的时候将他们保存下来。
./examples/mnist/train_lenet.sh|& tee train_loss.log
这样保存了运行的log文件。利用tools目录下的parse_log.sh将保存的log文件parse成两个文件.test文件和.train文件。
./parse_log.sh train_loss.log
生成两个文件:train_loss.log.test、train_loss.log.train
通过修改plot_log.gnuplot.example(tools文件夹下),可以画出Training loss vs.training iterations曲线、Training loss vs.training time曲线等各种曲线。
5.2、查看finetune过程中生成的snapshot
使用train生成的model进行单张图片的测试任务(单张图片分类)
./build/examples/cpp_classification/classification.bin models/bvlc_reference_caffenet/deploy.prototxt models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
data/ilsvrc12/imagenet_mean.binaryproto data/ilsvrc12/synset_words.txt examples/images/basketball.jpg