在上篇博客生成train_lmdb与val_lmdb后,要进行网络与迭代器搭建,首先进行网络的搭建
1、数据层即输入层。
Caffe中数据以blob的格式进行存储和传输,在这一层中是实现数据其他格式与blob之间的转换,例如从高效的数据库lmdb或者level-db转换为blob,也可以从低效的数据格式如hdf5或者图片。另外数据的预处理也可以在本层实现,如减均值,放大缩小,裁剪和镜像等。
name:"LeNet"
layer{
name="mnist"
type="Data"
top="data"
top="label"
include {
phase:TRAIN
}
transform_param{
scale:0.00390625
}
data_param{
source:"path"
batch_size:64
backend:LMDB
}
}
其中,name为:网络名称,自己定义,include:在其中规定是训练还是测试,如果没有定义,则表明训练和测试均有此层。
数据层:name:该layer的名称;
type:层的类型。(1)如果是Data:数据来源于LMDB或者LevelDB,必须设置batch_size。source为包含数据库的目录名称。
(2)MemoryData:数据来源于内存,必须设置batch_size,channels,weight,height,MemoryData的数据层为:
layer{
top="data"
top="label"
name:"memory_data"
type:"MemoryData"
memory_data_param{
batch_size:2
channels:1
height:100
width:100
}
transform_param{
scale:0.0078125
mean_file:"mean_proto"
mirror:false
}
}
(3)HDF5Data:数据来源于Hdf5,必须设置batch_size,source,其数据层为:
layer{
top="data"
top="label"
name='data'
type="HDF5Data"
hdf5_data_param{
source="path"
batch_size=10
}
}
(4)ImageData:数据来源于图片,必须设置的参数为source,batch_size,可选参数为:rand_skip,shuffle,new_height,new_width.
layer{
top="data"
top="label"
name="data"
type="ImageData"
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
new_width: 256
}
}
2 视觉层:包括convolution卷积层,pooling池化层,Local Response Normalization(LRN)局部极大值抑制,im2col等层。
2.1 层类型:Convilution
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
weight_filler{
type:"xavier"
}
bias_filler{
type:"constant"}
}
}
其中:lr_mult:第一个表示权重w的学习率的系数,学习率=base_lr*lr_mult,第二个表示偏重bias的学习率系数。
num_output:卷积核kernel的个数。
kernel_size:kernel的大小,如果kernel的宽和高不等,需要用,kernel_h和kernel_w分别设定。
stride:卷积运算的步长,默认为1,也可以用stride_h,stride_w来确定。
pad:填充边缘的大小,设置结果与原图相同。
weight_filler:权重初始化,若设置为"constant",则默认为0,也可以使用"xavier"或者"Gaussian"进行初始化
bias_term:是否开启偏执项(0/1)
group:分组
(2) 层类型:pooling
layer{
name:"pool1"
type:"Pooling"
bottom:"conv1"
top:"pool1"
pooling_param{
pool:MAX
kernel_size:2
stride:2
}
}
必须设置的参数:kernel_size,其他参数:pool,pad,stride
(3) 层类型:LRN
layers{
name:"norm1"
type:"LRN"
bottom:"pool1"
top:"norm1"
lrn_param{
local_size:5
alpha:0.0001
beta:0.75
}
}
local_size:默认为5,如果是跨通道LRN,则表示求和的通道数;如果是在通道内LRN,则表示求和的正方形区域长度。
alpha:默认为1,归一化公式中的参数。beta:默认为5,归一化公式中的参数。norm_region:默认为ACROSS_CHANNELS。有两个选择,ACROSS_CHANNELS表示在相邻的通道间求和归一化。
(4)层类型:img2col,将一个大矩阵,重叠的划分为多个子矩阵,对每个子矩阵序列化为向量,最后得到另外一个矩阵,在caffe中,卷积运算就是先对数据进行img2col操作,再进行求解内积运算,这样做,这样做比原始的卷积操作更快。
3 激活层,对输入数据进行激活操作,常用的激活函数有:Sigmoid/TanH/AbsVal/RELU/Leaky_RELU收敛速度最快
layer{
name:"relu1"
type:"Relu"
bottom:"ip1"
top:"ip1"
}
Relu函数可选参数为:Max(0,x),可选参数:negative_slope:默认为0,对标准的Relu函数进行变化,如果设置了这个值,name数据为负数时,将不会为0,而是negative_slope*x
Power:f(x)=(shift+scale*x)^power
layer{
name:"layer"
botton:"in"
top:"out"
type:"Power"
power_param{
power:2
scale:1
shift:0
}
}
4 其他层:softmax_loss层,Inner Product层,accuracy层,reshape层和dropout层
(1)softmax_loss层
layer{
name:"loss"
bottom:"ip2"
bottom:"label"
top:"loss"
type:"SoftmaxWithLoss"
}
(2)全连接层:把输入当做一个向量,输出也是一个简单的向量
输入:n*c*h*w
输出:n*c*1*1
全连接层实际上也类似一种卷积层,只是它的卷积核大小和原数据大小一致,因此他的参数基本和卷积的参数一样
layer{
name:"ip2"
bottom:"ip1"
top:"ip2"
type:"InnerProduct"
param{
lr_mult:1
}
param{
lr_mult:2
}
inner_product_param{
num_putput:10
weight_filter{
type:"xavier"
}
bias_filter{
type:"constant"
}
}
}
(3)accuracy
layer{
name:"accuracy_1"
bottom:"ip2"
bottom:"label"
top:"accuracy"
type:"Accuracy"
include{
phase=TEST
}
}
(4)reshape层,改变数据维度
layer{
name:"reshape"
type:"Reshape"
bottom:"input"
top:"output"
reshape_param{
shape{
dim:0
dim:2
dim:3
dim:-1
}
}
}
(5)Dropout层,防止过拟合,可以随机让网络某些隐含节点的权重不工作
layer{
name:"drop7"
bottom:"fc7-conv"
top:"fc7-conv"
type:"Dropout"
dropout_param{
dropout_ratio:0.5
}
}
参考博客:https://blog.csdn.net/u014202086/article/details/75226445