为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载。但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了。
注意:在caffe中运行所有程序,都必须在根目录下进行,即caffe/,否则会出错,因为脚本文件对应的目录是caffe的根目录。
1、cat and fish-bike实例
step1: 生成train/test/val.txt文件
在安装完成的caffe/examples/images中有如下文件:
其中create_filelist.sh用来生成文件列表,
运行命令,就可以生成train.txt文件了:
sh ./examples/images/create_filelish.sh
下面是文件内容,每个文件名后面会跟一个对应的标签,要特别注意的是类别的标签是从0开始,因为C++的数组总是从0开始的, 图片比较少的时候可以手动编写该文件,也可以借助于python代码生成,生成另外的test.txt和val.txt方式是一样的。
step2:根据第一步生成的文件,生成lmdb数据库文件,数据可文件生成可以借助于caffe提供的convert_imagetset.cpp文件接口,
命令格式:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
参数 | 参数含义 |
-gray | 是否以灰度图的方式打开图片。程序调用OpenCV库中的imread()函数来打开图片,默认为false. |
-shuffle | 是否随机打乱图片顺序,默认为false. |
-backend | 需要转换的文件格式,支持LevelDB或者LMDB,默认为LMDB。 |
-resize_width/resie_height | 改变图片大小,对于全连接网络需要输入的图片尺寸一致。 |
-check_size | 检查所有的数据是否具有相同的尺寸,默认为false不检查。 |
-encoded | 是否将原图片的编码放入最终的数据中。 |
-encode_type | 与上一个参数对应,将图片编码为对应的格式。 |
使用案例,可以参考文件create_lmdb.sh:
接下来就是开展caffe训练部件的制作工作了。
step1: 网络proto文件的编写,针对网络的proto文件的编写,我们通常会遇到train.prototxt、test.prototxt、deploy.prototxt三个文件。他们究竟有什么区别呢?简单来讲,Train需要损失需要反传;test也是需要算损失,但是不需要反传;deploy二者都不需要,一般用于项目部署。
获得网络文件的方法通常可以使用接口生成,例如pycaffe(caffe的python接口学习)、Matcaffe、C++接口、当然也可以直接手撸结构。
step2: solver训练网络参数配置文件,参考caffe的python接口学习:生成solver文件
step3:训练脚本的编写。
编写好了solver文件和网络文件以后,接下来就是开始训练过程了,通常是从头开始训练一个网络。
随机初始化训练命令:
./build/tools/caffe train \
--solver=models/bvlc_reference_caffenet/solver.prototxt \
--gpu=0,1
微调训练命令:
./build/tools/caffe train \
--solver=models/bvlc_reference_caffenet/solver.prototxt \
--weights=xx.caffemodel --gpu=0,1
断点恢复接续训练命令:
./build/tools/caffe train \
--solver=models/bvlc_reference_caffenet/solver.prototxt \
--snapshot=xx.solverstate --gpu=0,1
最后一步就是根据训练文件的日志进行解析,分析训练情况了。
step1:记录训练日志,在训练的过程中加入一行的参数,将log日志放入固定为文件夹内。
TOOLS=./build/tools
GLOG_logtostderr=0 GLOG_log_dir=/caffe/train/Log/ \
$TOOLS/caffe train \
--solver=face/cassasf_cnn/fsds_solver.prototxt
step2: 解析日志。
在caffe中找到extra文件夹内的parse_log.py,即可以使用这个文件进行日志的解析。
操作的命令为:
python parse_log.py log/xxxx.log
step3:绘制曲线。
在绘制曲线是,首先将caffe中的tools/extra plot_training_log.ptr.example这个文件拷贝为tools/extra plot_training.py,然后使用这个文件进行绘图操作。
对应命令,其中6是一个输出的状态码,不同的状态码对应着不同的输出,具体可以参考plot_training_log.ptr.example文件:
python plot_training_log.py 6 trainloss.png xxx_out.log
mnist是一个手写数字库,由DL大牛Yan LeCun进行维护。mnist最初用于支票上的手写数字识别, 现在成了DL的入门练习库。征对mnist识别的专门模型是Lenet,算是最早的cnn模型了。
2、mnist实例
mnist数据训练样本为60000张,测试样本为10000张,每个样本为28*28大小的黑白图片,手写数字为0-9,因此分为10类。
首先下载mnist数据,假设当前路径为caffe根目录
# sh data/mnist/get_mnist.sh
运行成功后,在 data/mnist/目录下有四个文件:
train-images-idx3-ubyte: 训练集样本 (9912422 bytes)
train-labels-idx1-ubyte: 训练集对应标注 (28881 bytes)
t10k-images-idx3-ubyte: 测试集图片 (1648877 bytes)
t10k-labels-idx1-ubyte: 测试集对应标注 (4542 bytes)
这些数据不能在caffe中直接使用,需要转换成LMDB数据
# sh examples/mnist/create_mnist.sh
如果想运行leveldb数据,请运行 examples/siamese/ 文件夹下面的程序。 examples/mnist/ 文件夹是运行lmdb数据
转换成功后,会在 examples/mnist/目录下,生成两个文件夹,分别是mnist_train_lmdb和mnist_test_lmdb,里面存放的data.mdb和lock.mdb,就是我们需要的运行数据。
接下来是修改配置文件,如果你有GPU且已经完全安装好,这一步可以省略,如果没有,则需要修改solver配置文件。
需要的配置文件有两个,一个是lenet_solver.prototxt,另一个是train_lenet.prototxt.
首先打开lenet_solver_prototxt
# vi examples/mnist/lenet_solver.prototxt
根据需要,在max_iter处设置最大迭代次数,以及决定最后一行solver_mode,是否要改成CPU
保存退出后,就可以运行这个例子了
# time sh examples/mnist/train_lenet.sh
CPU运行时候大约13分钟,GPU运行时间大约4分钟,GPU+cudnn运行时候大约40秒,精度都为99%左右。
加上time参数统计整个运行时间,可以看到这台机器用了33秒。
sh examples/mnist/train_lenet.sh >& log.txt &
上面这条命令也是训练mnist数据集的一种办法,他的区别是支持caffe 转入后台训练,不担心电脑是否断电或者是终端(有意或无意)关闭,都可随时从其他终端中查看训练进度。
其中,“>&”表示所有的标准输出和标准错误输出都将被重定向,log.txt为重定向后保存的文件,最后的“&”表示将命令放入后台执行。
在caffe/tools/extra/下面有相关的根据日志文件画出运行曲线图的py文件,例如可通过以下命令生成一张准确率曲线的图像。
python ~/caffe/tools/extra/plot_training_log.py.example 0 plot.png a.log
3、cifar10实例
cifar10数据训练样本50000张,测试样本10000张,每张为32*32的彩色三通道图片,共分为10类。
下载数据:
# sh data/cifar10/get_cifar10.sh
运行成功后,会在 data/cifar10/文件夹下生成一堆bin文件
转换数据格式为lmdb:
# sh examples/cifar10/create_cifar10.sh
转换成功后,会在 examples/cifar10/文件夹下生成两个文件夹,cifar10_train_lmdb和cifar10_test_lmdb, 里面的文件就是我们需要的文件。
为了节省时间,我们进行快速训练(train_quick),训练分为两个阶段,第一个阶段(迭代4000次)调用配置文件cifar10_quick_solver.prototxt, 学习率(base_lr)为0.001
第二阶段(迭代1000次)调用配置文件cifar10_quick_solver_lr1.prototxt, 学习率(base_lr)为0.0001
前后两个配置文件就是学习率(base_lr)和最大迭代次数(max_iter)不一样,其它都是一样。如果你对配置文件比较熟悉以后,实际上是可以将两个配置文件合二为一的,设置lr_policy为multistep就可以了。
base_lr: 0.001
momentum: 0.9
weight_decay: 0.004
lr_policy: "multistep"
gamma: 0.1
stepvalue: 4000
stepvalue: 5000
运行例子:
# time sh examples/cifar10/train_quick.sh
GPU+cudnn大约43秒左右,精度76%左右。