【9】Caffe学习系列:运行caffe自带的简单例子

为了程序的简洁,在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%左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值