lenet_train_test.prototxt原始文件,图中有详细注释
name: "LeNet" #网络的名字"LeNet"
layer { #定义一个层
name: "mnist" #层的名字"mnist"
type: "Data" #层的类型"Data",表明数据来源于LevelDB或LMDB。另外数据的来源还可能是来自内存,HDF5,图片等
top: "data" #输出data
top: "label" #输出label
include {
phase: TRAIN #该层只在TRAIN训练的时候有效
}
transform_param { #数据的预处理
scale: 0.00390625 #1/256,将输入的数据0-255归一化到0-1之间
}
data_param {
source: "E:/Caffe-windows/caffe-windows/examples/mnist/lmdb/train_lmdb" #数据来源
batch_size: 64 #每个批次处理64张图片
backend: LMDB #数据格式LMDB
}
}
layer { #定义一个层
name: "mnist" #层的名字"mnist"
type: "Data" #层的类型"Data",表明数据来源于LevelDB或LMDB
top: "data" #输出dada
top: "label" #输出label
include {
phase: TEST #该层只在TEST测试的时候有效
}
transform_param { #数据的预处理
scale: 0.00390625 #1/256,将输入的数据0-255归一化到0-1之间
}
data_param {
source: "E:/Caffe-windows/caffe-windows/examples/mnist/lmdb/test_lmdb" #数据来源
batch_size: 100 #每个批次处理100张图片
backend: LMDB #数据格式LMDB
}
}
layer { #定义一个层
name: "conv1" #层的名字"conv1"
type: "Convolution" #层的类型"Convolution"
bottom: "data" #输入data
top: "conv1" #输出conv1
param { #这个是权值的学习率
lr_mult: 1 #学习率系数。最终的学习率是这个学习率系数lr_mult乘以solver.prototxt里面的base_lr
}
param { #这个是偏置的学习率
lr_mult: 2 #学习率系数。最终的学习率是这个学习率系数lr_mult乘以solver.prototxt里面的base_lr
}
convolution_param {
num_output: 20 #卷积核的个数为20,或者表示输出特征平面的个数为20
kernel_size: 5 #卷积核的大小5*5。如果卷积核长和宽不等,则需要用kernel_h和kernel_w分别设置
stride: 1 #步长为1。也可以用stride_h和stride_w来设置
weight_filler { #权值初始化
type: "xavier" #使用"Xavier"算法,也可以设置为"gaussian"
}
bias_filler { #偏置初始化
type: "constant" #一般设置为"constant",取值为0
}
}
}
layer { #定义一个层
name: "pool1" #层的名字"pool1"
type: "Pooling" #层的类型"Pooling"
bottom: "conv1" #输入conv1
top: "pool1" #输出pool1
pooling_param {
pool: MAX #池化方法。常用的方法有MAX,AVE或STOCHASTIC
kernel_size: 2 #池化核的大小2*2。如果池化核长和宽不等,则需要用kernel_h和kernel_w分别设置
stride: 2 #池化的步长。也可以用stride_h和stride_w来设置
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50 #卷积核的个数为50,或者表示输出特征平面的个数为50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer { #定义一个层
name: "ip1" #层的名字"ip1"
type: "InnerProduct" #层的类型"InnerProduct",全连接层
bottom: "pool2" #输入pool2
top: "ip1" #输出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 { #定义一个层
name: "relu1" #层的名字"relu1"
type: "ReLU" #层的类型"ReLU",激活函数
bottom: "ip1" #输入ip1
top: "ip1" #输出ip1
}
layer { #定义一个层
name: "ip2" #层的名字"ip2"
type: "InnerProduct" #层的类型"InnerProduct",全连接层
bottom: "ip1" #输入ip1
top: "ip2" #输出ip2
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10 #10个输出,代表10个分类
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer { #定义一个层
name: "accuracy" #层的名字"accuracy"
type: "Accuracy" #层的类型"Accuracy",用来判断准确率
bottom: "ip2" #层的输入ip2
bottom: "label" #层的输入label
top: "accuracy" #层的输出accuracy
include {
phase: TEST #该层只在TEST测试的时候有效
}
}
layer { #定义一个层
name: "loss" #层的名字"loss"
type: "SoftmaxWithLoss" #层的类型"SoftmaxWithLoss",输出loss值
bottom: "ip2" #层的输入ip2
bottom: "label" #层的输入label
top: "loss" #层的输出loss
}