1.mnist实例
##1.数据下载 获得mnist的数据包,在caffe根目录下执行./data/mnist/get_mnist.sh脚本。 get_mnist.sh脚本先下载样本库并进行解压缩,得到四个文件。
2.生成LMDB
成功解压缩下载的样本库后,然后执行./examples/mnist/create_mnist.sh。 create_mnist.sh脚本先利用caffe-master/build/examples/mnist/目录下的convert_mnist_data.bin工具,将mnist data转化为caffe可用的lmdb格式文件,然后将生成的mnist-train-lmdb和mnist-test-lmdb两个文件放在caffe-master/example/mnist目录下面。
3.网络配置
LeNet网络定义在./examples/mnist/lenet_train_test.prototxt 文件中。
name: "LeNet"
layer {
name: "mnist" //输入层的名称mnist
type: "Data" //输入层的类型为Data层
top: "data" //本层下一场连接data层和label blob空间
top: "label"
include {
phase: TRAIN //训练阶段
}
transform_param {
scale: 0.00390625 //输入图片像素归一到[0,1].1除以256为0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb" //从mnist_train_lmdb中读入数据
batch_size: 64 //batch大小为64,一次训练64条数据
backend: LMDB
}
}
layer {
name: "mnist" //输入层的名称mnist
type: "Data" //输入层的类型为Data层
top: "data" //本层下一场连接data层和label blob空间
top: "label"
include {
phase: TEST //测试阶段
}
transform_param {
scale: 0.00390625 //输入图片像素归一到[0,1].1除以256为0.00390625
}
data_param {
source: "examples/mnist/mnist_test_lmdb" //从mnist_test_lmdb中读入数据
batch_size: 100 //batch大小为100,一次训练100条数据
backend: LMDB
}
}
layer {
name: "conv1" //卷积层名称conv1
type: "Convolution" //层类型为卷积层
bottom: "data" //本层使用上一层的data,生成下一层conv1的blob
top: "conv1"
param {
lr_mult: 1 //权重参数w的学习率倍数
}
param {
lr_mult: 2 //偏置参数b的学习率倍数
}
convolution_param {
num_output: 20 //输出单元数20
kernel_size: 5 //卷积核大小为5*5
stride: 1 //步长为1
weight_filler { //允许用随机值初始化权重和偏置值
type: "xavier" //使用xavier算法自动确定基于输入—输出神经元数量的初始规模
}
bias_filler {
type: "constant" //偏置值初始化为常数,默认为0
}
}
}
layer {
name: "pool1" //层名称为pool1
type: "Pooling" //层类型为pooling
bottom: "conv1" //本层的上一层是conv1,生成下一层pool1的blob
top: "pool1"
pooling_param { //pooling层的参数
pool: MAX //pooling的方式是MAX
kernel_size: 2 //pooling核是2*2
stride: 2 //pooling步长是2
}
}
layer {
name: "conv2" //第二个卷积层,同第一个卷积层相同,只是卷积核为50
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 {
name: "pool2" //第二个pooling层,与第一个pooling层相同
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer { //全连接层
name: "ip1" //全连接层名称ip1
type: "InnerProduct" //层类型为全连接层
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param { //全连接层的参数
num_output: