caffe+linux平台——运行最初的mnist手写识别

大家好,我最近在caffe上学习深度学习,跑了一个mnist手写识别的例子,但是当时在网上搜索,只有告诉你步骤该怎么做,但具体的caffe执行程序的编写没有一步步告诉你是什么意思,我现在来总结一下,还在学习,有误欢迎指正。


总体框架如下:

首先我们需要下载数据库,下载好后,用create_mnist.sh将格式转换为lmdb格式并生成mnist_test_lmdb和mnist_train_lmdb两个文件夹,第二步我们编写lenet_solver.prototxt和lenet_train_test.prototxt文件搭好学习框架,最后运行train_lenet.sh进行训练。这些执行步骤和代码网上有很多详细说明,此处不再赘述。

下面来解析一下lenet_solver.prototxt和lenet_train_test.prototxt

lenet_train_test.prototxt中,首先说数据层

layer{

name:"mnist"#层名称,可随便取

type:"data"#层类型

top:"data"#在前向传播中,输出数据类型为top,输入数据类型为bottom

top:"label"#在后向传播中,输出数据类型为bottom,输出数据类型为top

include{

phase:TRAIN#表示这一层是用于训练还是测试,如果没有include表示训练测试都可用

}

transform_param{

scale:o.oo390625#数据预处理,将数据变换到定义的范围内,例如此处scale为1/255,即将输入数据有0-255归一化到0-1

}

data_param{

source:"mnist/mnist_train_lmdb"#包含数据库的目录名称

batch_size:100#每次处理的数据个数

backend:LMDB#选择采用Level1DB还是LMDB,默认为Level1DB

}

}

然后是CNN卷积层

layer{

name:"conv1"

type:"convolution"

bottom:"data"

top:"conv1"

param{

lr_mult:1#学习率系数,如有两个学习率系数,则第一个是权重的学习率,第二个是偏置的学习率

}

param{

lr_mult:2#一般偏置的学习率是权重的两倍

}

convolution_param{

num_output:20#卷积和的个数

kernel_size:5#卷积核大小

stride:1#卷积核步长,默认为1

weight_filler{

type:"xavier"#权重初始化

}

bias_filler{

type:"constant"#偏置初始化

}

}

}

接着是池化层

layer{

name:"pool1"

type:"Pooling"

bottom:"conv1"

top:"pool1"

pooling_param{

pool:MAX

kernel_size:2

stride:2

}

}

全连接层

layer{#把输入当做一个向量,输出也是一个简单向量,即把输入数据blobs的width和height全变为1

name:"ip1"

type:"InnerProduct"

bottom:"pool2"

param{

lr_mult:1#学习率系数,如有两个学习率系数,则第一个是权重的学习率,第二个是偏置的学习率

}

param{

lr_mult:2#一般偏置的学习率是权重的两倍

}

inner_product_param{

num_output:500#卷积和的个数,在全连接层卷积核大小和原数据大小一致

weight_filler{

type:"xavier"#权重初始化

}

bias_filler{

type:"constant"#偏置初始化

}

}

}

剩下的还有accuracy层等等,但跟已经介绍的用法类似,可以举一反三。

希望对大家有帮助,我们下期见!




















猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/78522202
今日推荐