caffe学习笔记(一):MNIST例程

参考数目《深度学习-21天实战caffe》-第6天 运行手写体数字识别例程


1 下载MNIST数据集

cd data/mnist/
./get_mnist.sh


2 转换格式

  将原始二进制数据文件转换为LMDB格式

./examples/mnist/create_mnist.sh

  例程目录下生成例一下两个目录:

    examples/mnist/mnist_train_lmdb/   训练集

    examples/mnist//mnist_test_lmdb/   测试集

  每个目录下都有两个文件:data.mdb和lock.mdb


  create_mnist.sh代码如下:

#!/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."
  create_mnist.sh调用了build/examples/mnist/convert_mnist_data.bin可执行程序.

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分钟左右,训练完成! 

  脚本代码如下:

#!usr/bin/env sh
./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt
  可见代码调用了build/tools/caffe.bin 


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值