caffe finetune基本步骤

参考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、调整网络参数

  1. prototxt文件中的data层,修改source和meanfile,根据自己的lmdb和mean.binaryproto修改。
  2. 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 

猜你喜欢

转载自blog.csdn.net/qq_18644873/article/details/84634580