学习caffe深度学习框架时,最基本的一个应用实例是手写字体识别例程,这是caffe自带的例程,通过这个例程可以了解caffe框架使用的一个基本流程。在这个例程中,知识点比较多,在这篇文章中,我们只关系操作相关的内容,不进行代码和理论分析,让大家先把例程跑通,然后再分成几篇文章对这个例程的知识点进行介绍。 这个例程的样板是MNIST数据集,它是一个大型手写体数字的数据库,包含了60000个训练集和10000个测试集,每张图都已经进行了尺寸归一化,数字居中处理,固定尺寸为28像素X28像素。数据集的样本如下图所示。这个例程我们使用这个数据库对caffe网络进行训练,并用训练的网络进行预测。 1、下载MNIST数据集这个例程,我们在caffe的安装目录下进行,首先我们在终端中进入到caffe安装目录,然后执行下面的命令
cd data/mnist ./get_mnist.sh
这两个命令的作用是进入到mnist文件夹,并且采用get_mnist.sh脚本文件来下载MNIST数据集。成功执行命令之后,在文件夹下下载下来4个文件,分别为:t10k-images-idx3-ubyte、t10k-labels-idx1-ubyte、 train-images-idx3-ubyte、train-labels-idx1-ubyte。它们分别是测试集图片文件、测试集标签文件、训练集图片文件、训练集标签文件。
2、数据集格式转换
关于这些文件的详解,会在后面的文章中进行。这里可以先不管这几个文件。上一步我们下载到的数据集为二进制文件,无法直接用于caffe网络的训练,我们需要把它准话为LMDB格式的文件。
在caffe的根目录下,执行下面的命令
./examples/mnist/create_mnist.sh
执行完之后,在example/mnist/目录下,生成了两个文件夹mnist_train_lmdb和mnist_test_lmdb,在这两个文件夹下每个文件夹下包含两个文件data.mdb和lock.mdb。这4个文件就是转换完成的LMDB格式的训练集和测试集文件。
3、训练模型在这个实例中,我们使用的深度学习网络为LeNet-5网络模型,它的描述文件为examples/mnist/lenet_train_test.prototxt,训练和测试的求解器的描述文件为examples/mnist/lenet_solver.prototxt。
这一步我们对模型参数进行训练,在训练之前首先打开lenet_solver.prototxt文件。文件的最后一行修改为
solver_mode: CPU
即采用CPU模式。
在caffe根目录下采用下面的命令对模型进行训练
./examples/mnist/train_lenet.sh
模型开始训练,在终端上会打印出训练日志,训练日志内容比较多,经过我们以后的讲解后我们会明白训练日志的每一条的作用,这里我们先不用深究日志的内容。训练日志的最后,如下所示。
I0207 15:20:14.125481 7502 solver.cpp:414] Test net output #0: accuracy = 0.9913 I0207 15:20:14.125722 7502 solver.cpp:414] Test net output #1: loss = 0.0262061 (* 1 = 0.0262061 loss) I0207 15:20:14.125864 7502 solver.cpp:332] Optimization Done. I0207 15:20:14.125982 7502 caffe.cpp:250] Optimization Done.
打印出了测试的识别精度和损失。
训练之后,在/examples/mnist/目录下生成了四个新的文件:lenet_iter_5000.caffemodel、lenet_iter_5000.solverstate、lenet_iter_10000.caffemodel、lenet_iter_10000.solverstate,它们分别为进行了5000次和10000次迭代式生成的快照,快照包含权值文件.caffemodel和求解器状态文件.solverstate。
4、数据预测在上一步中,我们完成了模型的训练,这一步,我们用训练好的模型参数进行预测,在caffe根目录下执行下面的命令
./build/tools/caffe.bin test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -iterations 100
这个命令是调用caffe.bin对模型的识别效果进行预测,test表示处于测试状态,-model examples/mnist/lenet_train_test.prototxt指定了预测使用的模型,与我们训练时使用的模型一样,-weights examples/mnist/lenet_iter_10000.caffemodel指定预测使用的权值文件为我们上一步训练得到的权值文件,-iterations 100表示迭代次数为100次。
执行之后,在终端中打印的日志的最后两行为
I0217 13:54:22.387477 28867 caffe.cpp:321] accuracy = 0.9913 I0217 13:54:22.387509 28867 caffe.cpp:321] loss = 0.0262061 (* 1 = 0.0262061 loss)
给出了识别精度和损失。至此我们完成了手写字体识别的例程测试。
作者:fxfreefly