LeNet-5 train_val.prototxt文件解释和 solver.prototxt文件解释
name: "LeNet"//网络名称
layer {//定义一个层
name: "mnist"//层的名字
type: "Data"//输入层的类型为lmdb,如果输入数据格式为图片,则此处应该是imagedata
top: "data"//输出为两层,一层是数据一层是标签
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {//数据层相关参数
source: "examples/mnist/mnist_train_lmdb"
batch_size: 64
backend: LMDB
}
}
layer {
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
}
}
关于以上相关解释:
name: 表示该层的名称,可随意取
type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采 用的LevelDB或LMDB数据,因此层类型设置为Data;如果输入图片是image,那么这里需要类型需要设置为imagedata。
top或bottom: 每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个 top或多个bottom,表示有多个blobs数据的输入和输出。
data 与 label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。
include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。
Transformations: 数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255, 即将输入数据由0-255归一化到0-1之间,也可以添加均值和裁剪操作。如下:
transform_param {
scale: 0.00390625
mean_file_size: "examples/cifar10/mean.binaryproto"
# 用一个配置文件来进行均值操作
mirror: 1 # 1表示开启镜像,0表示关闭,也可用ture和false来表示
# 剪裁一个 227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
crop_size: 227
}
具体相关解释:
scale:0.0039就是1/256,将所有像素值从0-256归一到0-1;
crop_size:对输入图像进行随机裁剪一个227*227大小的图片,以哪个像素为中心不确定。
mirror:从数据库中读进来的数据,是否开启随机镜像,避免训练结果过拟合,只在训练阶段有效。这里翻阅源码,注意多通道图像的保存方式为将三个通道的所有像素值组成一个大的数组,然后根据data_index和top_index两个索引完成图片的镜像,为什么是随机镜像,因为镜像是建立在crop的基础上的,而crop又是随机的,所以也是随机镜像。
data_param部分,需要根据输入数据类型的不同,进行不同的设置。具体分为以下几种情况: