Caffe各层详解 学习
通过学习 Caffe模型各层详解.pdf 总结笔记如下:
一、数据层
数据来自于数据库(LevelDB和LMDB)
layer{
name:"cifar"
type:"Data"
top:"data" # 一般数据层都有两个输出,data和label
top:"label"
include{
phase:TRAIN # include一般用来指定当前layer是属于测试还是训练
}
transform_param{
mean_file:"examples/cifar10/mean.binaryproto" # 此处参数一般用于数据预处理,归一化,减均值,除方差啥的
}
data_param{
source:"examples/cifar10/cifar_train_lmdb" # 数据集存储位置
batch_size:100 # 每batch处理多少数据(张图片)
backend: LMDB # 用的哪种(LevelDB和LMDB)
}
}
其他还有数据来自MemoryData、HDF5Data、ImageData,结构大同小异:
1、MemoryData:
必设参数:
memory_data_param{
batch_size:2
height:100
width:100
channels:1
}
2、HDF5:
必设参数:
hdf5_data_param{
source:"examples/hdf5_calssification/data/train.txt" # 读取文件路径
batch:10
}
3、ImageData
必设参数:source、batch_size
可选参数:rand_skip、shffle(默认False)、(new_height、new_width)(如果设置则将图片resize)
ImageData举例:
layer{
name:"data"
type:"ImageData"
top:"data"
top:"label"
transform_param{
mirror:false # 是否对图片做镜像数据增强
crop_size:227 # 在train阶段随机裁剪,在测试阶段裁剪中间部分
mean_file:“data/ilsvrc12/iamge_mean.binaryproto" # 可以使用经典的BGR均值,不用对每个数据集计算均值
}
image_data_param{
source:"examples/_temp/file_list.txt"
batch_size:50
new_height:256 # 对图片做resize
new_width:256
}
}
二、视觉层及参数
视觉层包括:Convolution,Pooling,Local Response Normalization(LRN),im2col等层
1、Convolution层
很简单,直接上例子吧
layer{
name: "conv1"
type:"Convolution"
bottom:"data" # 接上数据层
top:"conv1"
param{
lr_mult: 1 # 第一个学习率参数对应权值,具体学习率等于lr_mult*base_lr(这个设置在solver文件中) ,想要不更新(冻结)这层的参数,只需将lr_mult设置为0
}
param{
lr_mult:2 # 偏置的学习率参数,同样具体学习率为lr_mult*base_lr。一般来说,偏置的学习率是权值的2倍(可能是因为一般偏置初始化为0?)
}
Convolution_param{
num_output:20 # 卷积核(kernel)个数
kernel_size:5
stride:1
weight_filler{
type:"xavier" # 用何种方法初始化权值,一般有xavier、gaussion、constant(默认为0,一般用于初始化偏置)
}
bias_filler{
type:"constant" # 默认为0
}
}
}
2、Pooling层
非常简单,看看就知道:
layer{
name:"pool1"
type:"Pooling"
bottom:"conv1"
top:"pool1"
pooling_param{
pool:MAX # 默认MAX,还有AVE,STOCHASTIC(统计?)
kernel_size:3
stride:2
}
}
3、Local Response Normalization
对一个输入进行局部归一化,有两种方式,一种是通道间的(二维平面的一个像素点,以及这个二维平面临近二维平面的对应位置像素点组成,可以描述为 local_size x 1 x 1),一种是通道内的(描述为 1 x local_size x local_size)
计算公式:。。。自己搜吧,很简单的
给个例子:
layer{
name:"norm1"
type:"LRN"
bottom:"pool1"
top:"norm1"
lrn_param{
local_size:5
alpha:0.0001
beta:0.75
norm_region: ACROSS_CHANNELS # 或者WITHIN_CHANNEL
}
}
三、激活层及其参数
就是对输入的每个元素都进行了一个函数变换而已,所以输入和输出结构相同。
激活函数主要有:
Sigmoid:无参数
ReLU:一般不用参数,有可选参数negative_slope,就是负数时不再设置为0,而是原始数据*negative_slope
TanH
AbsVal:求每个输入的绝对值
Power:进行幂运算:f(x)=(shift+scale*x)^power
BNLL:f(x)=log(1+exp(x))
Power例子:
layer{
name:"layer"
bottom:"in"
top:"out"
type:"Power" # 那些无参数的写到这就ok了
power_param{
power:2
scale:1
shift:0
}
}
写了这么多层的例子,你还没发现吗,layer的结构就是名字、输入输出、类型加上参数,就OK了。
四、其他常用层
1、softmax层:
输入是各个类的可能性,输出是似然值
例行结构:
layer{
name:"prob"
bottom::"cls3_fc"
top:"prob"
type:"Softmax"
}
2、soft-max层:输入还是可能性,先计算prob,再输出取gt类标对应的prob的负对数值
layer{
name:"loss"
bottom:"ip1" # 可能性
bottom:"label"
top:"loss"
type:"SoftmaxWithLoss"
}
3、InnerProduct层(全连接层)
没什么好说的,和Convolution层一样,不记得的话翻上去看。
4、accuracy层:
只在test阶段有
结构:
layer{
name:"accuracy"
bottom:"ip2"
bottom:"label"
top:"accuracy"
type:"accuracy"
include{
phase:TEST # 只在测试阶段有
}
}
5、Reshape层:
对任意blob进行维度变换,具体看代码:
layer{
name:"reshape"
bottom:"in"
top:"out"
type:"Reshape"
reshape_param{
shape{
dim:0 # 当前维度不变换
dim:0
dim:14 # 当前维度变为14
dim:-1 # 根据以上维度推算这个是多少,就不用自己去算啦,交给计算机
}
}
}
例如:
输入blob为: (64,3,28,28)
经过例子输出blob为: ( 64,3,14,56)
数据内容不变,只是结构改变。