参考数目《深度学习-21天实战caffe》-第6天 运行手写体数字识别例程
1 下载MNIST数据集
cd data/mnist/
2 转换格式./get_mnist.sh
将原始二进制数据文件转换为LMDB格式
./examples/mnist/create_mnist.sh
例程目录下生成例一下两个目录:examples/mnist/mnist_train_lmdb/ 训练集
examples/mnist//mnist_test_lmdb/ 测试集
每个目录下都有两个文件:data.mdb和lock.mdb
create_mnist.sh代码如下:
create_mnist.sh调用了build/examples/mnist/convert_mnist_data.bin可执行程序.#!/usr/bin/env sh # 本脚本将MNIST原始数据转换为LMDB格式 # LMDB文件生成路径 EXAMPLE=examples/mnist #原始数据路径 DATA=data/mnist #二进制文件路径 BUILD=build/examples/mnist #后端类型 BACKEND="lmdb" echo "Creating ${BACKEND}..." 创建训练集db rm -rf $EXAMPLE/mnist_train_${BACKEND} rm -rf $EXAMPLE/mnist_test_${BACKEND} 创建测试集db $BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \ $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND} $BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \ $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND} echo "Done."
3.LeNet-5模型
LeNet-5描述文件:examples/mnist/lenet_train_val.prototxt,代码如下:
name: "LeNet" // 网络(Net)的名称为LeNet layer { // 定义一个层(Layer) name: "mnist" // 层的名称为mnist type: "Data" // 层的类型为数据层 top: "data" // 层的输出blob有两个:data和label top: "label" include { phase: TRAIN // 该层参数只对训练阶段有效 } transform_param { scale: 0.00390625 // 数据变换使用的数据缩放因子 } data_param { // 数据层参数 source: "examples/mnist/mnist_train_lmdb" // LMDB的路径 batch_size: 64 // 批量数目,一次读取64张图 backend: LMDB // 数据格式为LMDB } } layer { // 一个新数据层,名字也叫mnist,输出blob也是data和label,但是这里定义的参数只有在分类阶段有效 name: "mnist" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { scale: 0.00390625 } data_param { source: "examples/mnist/mnist_test_lmdb" batch_size: 100 backend: LMDB } } layer { // 定义一个新的卷积层conv1,输入blob为data,输出blob为conv1 name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 // 权值学习速率倍乘因子,1倍表示保持与全局参数一致 } param { lr_mult: 2 // bias学习速率倍乘因子,是全局参数的2倍 } convolution_param { // 卷积计算参数 num_output: 20 // 输出feature map数目=20 kernel_size: 5 // 卷积核尺寸,5 x 5 stride: 1 // 卷积输出跳跃间隔,1表示连续输出,无跳跃 weight_filler { // 权值使用xavier填充器 type: "xavier" } bias_filler { // bias使用常数填充器,默认为0 type: "constant" } } } layer { // 定义新下采样层pool1,输入blob为conv1,输出blob为pool1 name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { // 下采样参数 pool: MAX // 使用最大值下采样方法 kernel_size: 2 // 下采样窗口尺寸 2 x 2 stride: 2 // 下采样输出跳跃间隔 2 x 2 } } layer { // 新的卷积层,和conv1类似 name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" param { lr_mult: 1 } param { lr_mult: 2 } convolution_param { num_output: 50 kernel_size: 5 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { // 新的下采样层,和pool1类似 name: "pool2" type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { // 新的全连接层,输入blob为pool2,输出blob为ip1 name: "ip1" type: "InnerProduct" bottom: "pool2" top: "ip1" param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { // 全连接层参数 num_output: 500 // 该层输出元素个数为500 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { // 新的非线性层,用ReLU方法 name: "relu1" type: "ReLU" bottom: "ip1" top: "ip1" } layer { name: "ip2" type: "InnerProduct" bottom: "ip1" top: "ip2" param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { num_output: 10 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { // 分类准确率层,只在Testing阶段有效,输入blob为ip2和label,输出blob为accuracy,该层用于计算分类准确率 name: "accuracy" type: "Accuracy" bottom: "ip2" bottom: "label" top: "accuracy" include { phase: TEST } } layer { // 损失层,损失函数采用SoftmaxLoss,输入blob为ip2和label,输出blob为loss name: "loss" type: "SoftmaxWithLoss" bottom: "ip2" bottom: "label" top: "loss" }
4. 训练模型运行examples/mnist/train_lenet.sh脚本,
./examples/mnist/train_lenet.sh
等待10分钟左右,训练完成!
脚本代码如下:
可见代码调用了build/tools/caffe.bin#!usr/bin/env sh ./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt
5. 测试模型
测试模型命令如下:
完成测试!./build/tools/caffe.bin test \ > -model examples/mnist/lenet_train_test.prototxt \ > -weights examples/mnist/lenet_iter_10000.caffemodel \ > -iterations 100
命令解释:
./build/tools/caffe.bin test \ //表示只做预测,不进行参数更新 > -model examples/mnist/lenet_train_test.prototxt \ //指定模型描述文本文件 > -weights examples/mnist/lenet_iter_10000.caffemodel \ //指定模型预先训练好的权值文件 > -iterations 100 //指定测试迭代次数。参与测试样例数目 = 迭代次数 * batch_size