参考:https://blog.csdn.net/cuxieqian4199/article/details/79914010
caffe模型需要两个最重要的参数文件:网络模型和参数模型,分别是*.prototxt和*.solver.prototxt文件。
本节介绍网络模型参数文件说明,参数模型文件说明参考《caffe参数模型配置说明》
训练数据层
layer {
name: "mnist" //网络模型的名称
type: "Data" //输入层的类型
top: "data" //本层下一层连接data
top: "label" //本层下一层连接label
include {
phase: TRAIN //训练阶段
}
transform_param {
scale:0.00390625 //输入图片像素归一化到[0,1],1除以256为0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb" //需要训练数据的路径
batch_size: 100 //批量处理数据大小
backend: LMDB //数据类型
}
}
name: 表示该层的名称,可随意取。
type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同。一般在练习的时候,我们都是采 用的LevelDB或LMDB数据,因此层类型设置为Data。
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之间
卷积层Convoluation
layer {
name: "conv1" //网络层的名称是conv1
type: "Convolution" //网络层的类型是卷积层
bottom: "data" //网络层的输入层是 data层
top: "conv1" //该层的输出层名称为conv1
/*param定义权重和偏置的学习率,学习率大,迭代速度快,但是容易找不到最优解,学习率小,迭代速度慢,耗时久。如果有两个lr_mult参数,则第一个表示权重(卷积核)的学习率系数,第二个表示偏置的学习率系。lr_mult定义的只是学习率系数,最终的值需要乘以solver.prototxt配置文件中配置的base_lr的值,一般偏置的学习率系数是权重学习率系数的2倍*/
param {
lr_mult: 1 //该层权重学习率的系数为1
}
param {
lr_mult: 2 //该层偏置学习率的系数为2
}
convolution_param { //卷积操作的参数设置
num_output: 20 //卷积输出特征图的数量为20
kernel_size: 5 //卷积核的大小是5*5
stride: 1 //卷积操作的步长是1,即卷积核逐个移动
weight_filler { //滤波的类型
type: "xavier" //卷积核参数采用xavier方法初始化
}
bias_filler {
type: "constant" //偏置初始值为0
}
}
}
池化层Pooling
layer {
name: "pool1" //网络层的名称是pool1
type: "Pooling" //网络层的类型是池化层
bottom: "conv1" //网络层的输入时conv1(第一卷积层)
top: "pool1" //网络层的输出名称是 pool1
//池化操作的参数设置
pooling_param {
pool: MAX //最大值池化
kernel_size: 2 //池化核尺寸 是2*2
stride: 2 //池化步长是2
}
}
全连接层
layer {
name: "ip1" //网络层的名称是ip1
type: "InnerProduct" //网络层的类型是 全连接层
bottom: "pool2" //网络层的输入时 pool2(第二池化层)
top: "ip1" //网络层的输出名称是ip1
param {
lr_mult: 1 //卷积核的学习率系数是1
}
param {
lr_mult: 2 //偏置的学习率系数是2
}
//第一全连接层参数设置
inner_product_param {
num_output: 500 //输出向量维度,500个输出神经元
weight_filler {
type: "xavier" //卷积核参数采用xavier方法初始化
}
bias_filler {
type: "constant" //偏置初始值为0
}
}
}
激活层ReLU
layer {
name: "relu1" //网络层的名称是relu1
type: "ReLU" //网络层的类型是ReLU激活函数
bottom: "ip1" //网络层的输入时ip1(第一全连接层)
top: "ip1" //网络层的输出名称是 ip1,跟输入名称一样
}
输出层Softmax
layer {
name: "prob" //网络的名称是 prob
type: "Softmax" //网络的类型是损失函数
bottom: "ip2" //网络的输入是 ip2(第二全连接层)
top: "prob" //网络的输出名称是 prob
}