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: 500