数据层定义
layer {
name: "cifar"
type: "Data" # 输入类型的是数据
top: "data" #一般用bottom表示输入,top表示输出,多个top代表有多个输出
top: "label"
include {
phase: TRAIN #训练网络分为训练阶段和自测试阶段,如果没写include则表示该层即在测试中,又在训练中
}
transform_param {
mean_file: "examples/cifar10/mean.binaryproto" #用caffe配置文件来进行均值的操作
transform_param {
scale: 0.00390625 #图像数据进行归一化1/255=0.00390625
morror:1 # 1开启镜像 0不开启
crop_size: 227 # 在原始图像上随机剪裁一个227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
}
}
data_param {
source: "examples/cifar10/cifar10_train_lmdb" #数据库来源
batch_size: 64 #每次批处理的个数 注意gpu显存大小
backend: LMDB #选用数据的名称
}
}
使用LMDB源
layer {
name: "mnist"
type: "Data"
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
}
}
使用HDF5数据源
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
hdf5_data_param {
source: "examples/hdf5_classification/data/train.txt"
batch_size: 10
}
}
数据直接来源与图片
file_list.txt:
/path/to/images/img3423.jpg 2
/path/to/images/img3424.jpg 13
/path/to/images/img3425.jpg 8
layer {
name: "data"
type: "ImageData" #类型
top: "data"
top: "label"
transform_param {
mirror: false
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
image_data_param {
source: "examples/_temp/file_list.txt"
batch_size: 50
new_height: 256 #如果设置就对图片进行resize操作
new_width: 256
}
}
卷积层
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
# 权值的学习率
param {
lr_mult: 1
# lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。
# 如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。
# 一般偏置项的学习率是权值学习率的两倍。
# 设置为0,这一层就不会进行更新
}
# 偏置项的学习率
param {
lr_mult: 2
}
convolution_param {
num_output: 20 #卷积核(filter)的个数
kernel_size: 5 #卷积核的大小,卷积核深度默认为上一次的深度
stride: 1 #卷积核的步长,默认为1
pad: 0 #扩充边缘,默认为0,不扩充
weight_filler {
type: "xavier" #权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
}
bias_filler {
type: "constant" #偏置项的初始化。一般设置为"constant",值全为0
}
}
}
输入:n*c0*w0*h0
输出:n*c1*w1*h1
其中,c1就是参数中的num_output,生成的特征图个数
w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;
池化层
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX #池化方法,默认为MAX。目前可用的方法有MAX, AVE
kernel_size: 3 #池化的核大小
stride: 2 #池化的步长,默认为1。一般我们设置为2,即不重叠。
}
}
#pooling层的运算方法基本是和卷积层是一样的。
激活函数
#在激活层中,对输入数据进行激活操作,是逐元素进行运算的,在运算过程中,没有改变数据的大小,即输入和输出的数据大小是相等的。
###Sigmoid
layer {
name: "test"
bottom: "conv"
top: "test"
type: "Sigmoid"
}
#ReLU是目前使用最多的激活函数,主要因为其收敛更快,并且能保持同样效果。标准的ReLU函数为max(x, 0),当x>0时,输出x; 当x<=0时,输出0
f(x)=max(x,0)
layer {
name: "relu1"
type: "ReLU"
bottom: "pool1"
top: "pool1"
}
全连接
#全连接层,输出的是一个简单向量 参数跟卷积层一样
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
#测试的时候输入准确率
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
reshape层
#在不改变数据的情况下,改变输入的维度
layer {
name: "reshape"
type: "Reshape"
bottom: "input"
top: "output"
reshape_param {
shape {
dim: 0 # 等于0则此维度不变,copy the dimension from below
dim: 2
dim: 3
dim: -1 # 自己推断 infer it from the other dimensions
}
}
}
有一个可选的参数组shape, 用于指定blob数据的各维的值(blob是一个四维的数据:n*c*w*h)。
dim:0 表示维度不变,即输入和输出是相同的维度。
dim:2 或 dim:3 将原来的维度变成2或3
dim:-1 表示由系统自动计算维度。数据的总量不变,系统会根据blob数据的其它三维来自动计算当前维的维度值 。
假设原数据为:32*3*28*28, 表示32张3通道的28*28的彩色图片
shape {
dim: 0
dim: 0
dim: 14
dim: -1
}
输出数据为:32*3*14*56
#Dropout是一个防止过拟合的层
#只需要设置一个dropout_ratio就可以了。
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7-conv"
top: "fc7-conv"
dropout_param {
dropout_ratio: 0.5 #dropout的概率
}
}
softmax
#softmax-loss layer:输出loss值
layer {
name: "loss"
type: "SoftmaxWithLoss" # loss=归一化,再-log pi
bottom: "ip1"
bottom: "label"
top: "loss"
}
#softmax layer: 输出似然值(准确率)
layers {
bottom: "cls3_fc"
top: "prob"
name: "prob"
type: “Softmax" # 准确率
}