基于Caffe的MNIST数据集训练与测试
原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html
摘要
在前面的博文中,我详细介绍了Caffe的网络结构和求解文件,还介绍了如何制作LMDB和Hdf5数据源文件。但是我们还没有完整的介绍过如何在Caffe框架下去训练一个神经网络模型,在本篇博文中我将从最经典、简单的卷积神经网络Lenet(CNN的开端)和最简单的数据集MNIST(手写数字)出发,详细介绍整个网络的训练与测试过程。
1. 项目文件目录介绍
首先还是要先介绍一下我的文件目录,我在目录E:caffe_program下面创建了一个mnist文件夹,mnist文件夹下面包括了所有训练模型的必要文件,还要保存训练之后的模型。请看mnist文件夹下的文件结构:
其中,data文件夹下包括了制作数据集的所有文件,还包括制作出来的LMDB格式的数据文件;Lenet_model将用于存储训练过的模型文件;剩下的分别是网络结构、求解文件以及训练网络的bat文件。
2. MNIST数据集介绍与下载
MNIST是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立。MNIST最初用于支票上的手写数字识别, 现在成了Deep Learning入门练习库(相当于编程的“hello world”)。针对MNIST识别的专门模型是Lenet,算是最早的CNN模型了。MNIST数据训练样本为60000张,测试样本为10000张,每个样本为28*28大小的黑白图片,手写数字为0-9,因此分为10类。MNIST数据库官方网址为:http://yann.lecun.com/exdb/mnist/ 。可直接下载四个解压文件,分别对应:训练集样本、训练集标签、测试集样本和测试集标签。下载及解压之后的文件如下(E:caffe_programmnistdata):
注意:这里也可以使用Caffe自带的get_mnist.sh运行得到解压的数据集(我的运行报错,显示缺少wget),但是我这里是自己去官网下载的,效果是一样的。
3. 将MNIST数据集制作成LMDB格式数据源
Caffe支持的数据格式有:LMDB、Leveldb、Hdf5、原始图像等。虽然LMDB的内存消耗是Leveldb的1.1倍,但是LMDB的速度比Leveldb快10%至15%,更重要的是LMDB允许多种训练模型同时读取同一组数据集。因此LMDB成为了Caffe的默认数据集格式。接下来我也将使用LMDB的数据格式进行手写字识别网络的训练与测试。
在编译好的Caffe中存在将MNIST数据集转换为LMDB的create_mnist.sh脚本文件,它的具体位置在D:你的安装目录caffecaffe-windowsexamplesmnist。我将其复制到我的项目之下(最好不要在原文件上修改),即放在我的data文件夹之下,具体路径是E:caffe_programmnistdata,文件目录如下:
接下来,我们将对create_mnist.sh脚本文件进行修改,修改后的脚本文件如下所示:
1 #!/usr/bin/env sh 2 # This script converts the mnist data into lmdb/leveldb format, 3 # depending on the value assigned to $BACKEND. 4 set -e 5 6 EXAMPLE=E:/caffe_program/mnist/data #生成的LMDB格式数据的存储路径 7 DATA=E:/caffe_program/mnist/data #原始的MNIST数据集的存储路径 8 BUILD=D:/caffe/caffe-windows/Build/x64/Release #编译好的caffe,主要是“convert_mnist_data.exe”的路径 9 10 BACKEND="lmdb" 11 12 echo "Creating ${BACKEND}..." 13 14 rm -rf $EXAMPLE/mnist_train_${BACKEND} 15 rm -rf $EXAMPLE/mnist_test_${BACKEND} 16 17 $BUILD/convert_mnist_data.exe $DATA/train-images.idx3-ubyte 18 $DATA/train-labels.idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND} 19 $BUILD/convert_mnist_data.exe $DATA/t10k-images.idx3-ubyte 20 $DATA/t10k-labels.idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND} 21 22 echo "Done." 23 24 read #表示等待输入,即暂停
从上述修改后的create_mnist.sh脚本文件可知,我们不仅对数据路径进行了修改,还将“convert_mnist_data.bin”修改为“convert_mnist_data.exe”(Windows系统下可执行文件是exe格式),将“train-images.idx3-ubyte”修改为“train-images.idx3-ubyte”(如果使用get_mnist.sh下载解压文件则不存在这个问题)因为下载的文件解压后数据的名称和脚本文件中名字不同。我在这里使用的是将脚本文件中的名字修改为和解压产生的文件的名称一致。
运行create_mnist.sh脚本文件(在Windows系统下,必须安装Git),将在data文件夹下产生训练集和测试集的LMDB格式的数据,目录结构展示如下:
至此,我们已经成功制作出了我们自己的MNIST的LMDB格式的数据集和测试集啦!
如果我们电脑上没有安装Git(也就是说在Windows系统下不能直接打开create_mnist.sh脚本文件),我们如何制作LMDB格式数据呢?
当我们的Windows系统没有安装Git时,其实也可以制作LMDB格式的数据集。首先我们需要知道create_mnist.sh脚本文件到底执行了什么操作,它其实就是通过修改数据的路径和数据的名称执行“convert_mnist_data.exe”可执行程序,生成了MNIST的LMDB格式数据集。既然脚本文件是执行可执行程序,那我们可以使用Windows系统下的批处理命令来代替这一操作。因此,我们可以在data文件夹下创建一个文本文件,然后将其修改为“convert_mnist.bat”,写入批处理命令,执行就可以得到LMDB数据集。批处理命令具体显示如下:
1 echo "create mnist_train_lmdb" 2 3 D:caffecaffe-windowsBuildx64Releaseconvert_mnist_data.exe ^ 4 E:caffe_programmnistdata rain-images.idx3-ubyte ^ 5 E:caffe_programmnistdata rain-labels.idx1-ubyte ^ 6 E:caffe_programmnistdatatrain_mnist_lmdb 7 8 echo "create mnist_train_lmdb" 9 10 D:caffecaffe-windowsBuildx64Releaseconvert_mnist_data.exe ^ 11 E:caffe_programmnistdata 10k-images.idx3-ubyte ^ 12 E:caffe_programmnistdata 10k-labels.idx1-ubyte ^ 13 E:caffe_programmnistdatatest_mnist_lmdb 14 15 16 pause
在windows系统先双击执行完这个bat文件之后,在data文件夹下生成和之前一样的LMDB格式数据,最后的目录结构如下:
4. Caffe框架下的模型训练与测试
上面的一系列操作,使得我们获得了MNIST数据集的LMDB的数据格式,接下来将会是真正去对模型进行训练与测试。我还是将整个过程分为几个步骤,一步一步的去做,才会使得思路更加清晰,自己对Caffe框架下训练和测试模型理解的更加透彻,废话不多说,一起开始吧!
(1)修改网络模型的描述文件
网络模型的描述文件:“lenet_train_test.prototxt”,顾名思义,就是网络的结构。它主要定义了模型的名称、网络架构、训练和测试集的路径等。在这里我们需要去修改的其实就是训练集和测试集的路径。我将网络模型文件放在了mnist文件夹下,即E:caffe_programmnist,具体的目录结构如下:
下面我将修改后的模型描述文件展示如下:
1 name: "LeNet" 2 layer { 3 name: "mnist" 4 type: "Data" 5 top: "data" 6 top: "label" 7 include { 8 phase: TRAIN 9 } 10 transform_param { 11 scale: 0.00390625 12 } 13 data_param { 14 source: "E:/caffe_program/mnist/data/train_mnist_lmdb" #制作的LMDB格式的训练数据的路径 15 batch_size: 64 16 backend: LMDB 17 } 18 } 19 layer { 20 name: "mnist" 21 type: "Data" 22 top: "data" 23 top: "label" 24 include { 25 phase: TEST 26 } 27 transform_param { 28 scale: 0.00390625 29 } 30 data_param { 31 source: "E:/caffe_program/mnist/data/test_mnist_lmdb" #制作的LMDB格式的测试数据的路径 32 batch_size: 100 33 backend: LMDB 34 } 35 }
(2)修改求解(超参数)文件
对于超参数文件来说,它的内容就是一些网络学习训练的超参数,像基础学习率、测试间隔、权重衰减率、动量、学习率策略、最大迭代步长等等。当然还包含了我们所要训练的网络结构描述文件的路径,还有训练之后模型的保存路径(在mnist文件夹下创建了子文件夹lenet_model)。修改后的超参数文件“lenet_solver.prototxt”详细如下所示:
# The train/test net protocol buffer definition net: "E:/caffe_program/mnist/lenet_train_test.prototxt" #我们要训练的网络结构描述文件的路径 # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. test_iter: 100 # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr_policy: "inv" gamma: 0.0001 power: 0.75 # Display every 100 iterations display: 100 # The maximum number of iterations max_iter: 10000 # snapshot intermediate results snapshot: 2000 #它表示每2000步迭代,进行一次模型输出保存 snapshot_prefix: "E:/caffe_program/mnist/lenet_model/lenet" #这里表示的输出模型的保存路径 # solver mode: CPU or GPU solver_mode: CPU #模型的训练求解方式只采用CPU
(3)开始训练模型
当我们把网络模型描述文件和超参数文件都修改完毕之后,训练模型将变得非常简单。首选,在mnist文件夹下创建一个文本文件,然后将其修改为“train_lenet.bat”,下面展示详细的bat批处理命令的细节:
D:caffecaffe-windowsBuildx64Releasecaffe.exe train ^ --solver=E:/caffe_program/mnist/lenet_solver.prototxt pause
双击运行上述的bat文件,开始训练网络模型(大概要几十分钟,根据电脑而定),可以在lenet_model文件夹下保存了5个训练好的模型,生成的模型详细如下:
(4)生成均值文件备用(训练数据)
首选,我们在data文件夹下创建一个文本文件,并将其修改为“generate_mean.bat”,然后写入批处理命令就可以生成训练数据的均值文件,批处理命令如下:
1 D:caffecaffe-windowsBuildx64Releasecompute_image_mean.exe ^ 2 E:caffe_programmnistdatatest_mnist_lmdb ^ 3 E:caffe_programmnistdatamean.binaryproto 4 5 pause
最终,可以在data文件夹下生成均值文件“mean.binaryproto”,留着均值文件备用。
(5)准备标签
因为这里是训练测试MNIST数据集,因此标签label就是0-9,我在data文件夹下创建标签文件“label.txt”,详细展示如下:
(6)测试模型的训练效果
在mnist文件夹下创建一个文本文件,然后将其修改为“test_mnist_classification.bat”,写入批处理命令,运行即可在中端中显示top5的预测结果。需要预测的数据放在data/0-9/文件夹下面,0-9文件夹详细内容如下:
下面详细展示批处理的命令:
1 D:caffecaffe-windowsBuildx64Releaseclassification.exe ^ 2 E:caffe_programmnistlenet.prototxt ^ 3 E:caffe_programmnistlenet_modellenet_iter_10000.caffemodel ^ 4 E:caffe_programmnistdatamean.binaryproto ^ 5 E:caffe_programmnistdatalabel.txt ^ 6 E:caffe_programmnistdata -99.bmp 7 8 pause
最终的运行结果显示如下:
这就是整个训练lenet模型,以及使用模型识别mnist数据集的详细过程。
5. 总结
整个过程虽然简单,但是有很多细节问题,稍不注意可能训练测试失败。通过这个简单的例子还是学到了很多知识,对Caffe框架的训练与测试过程更加熟悉。之后的学习将会越来越快,后面将会学习使用Python接口更快更方便的调用Caffe实现一系列 的训练测试过程。