{承接CNN学习入门,笔者在这里对Caffe官方网站上的相关介绍进行了翻译总结,欢迎大家交流指正}
本文基于此刻最新的release,Caffe-rc3:
Layers:
建立Caffe模型需要在protocol buffer的definition file即.prototxt文件中创建网络模型。
.prototxt文件中,层及层参数的解释方法又被定义在caffe.proto(src/caffe/proto)文件中。
1. Vision Layer:
头文件:./include/caffe/vision_layers.hpp
Vision Layer通常将images作为input并将生成其他images作为output。
现实生活中,images通常含有一个颜色通道(C = 1),所谓的灰度图像,或者三个通道(C = 3),所谓的RGB(Red Green Blue)图像。但在此文中,图像区别性的特征体现在它的空间结构上:一般的一张图片Height > 1同时Width > 1。这些2维的几何学特征将会自然而然的引出如何处理输入数据。
特别地,大多数的vision layer都将一些特殊操作应用于输入的一些特定区域,来产生对应位置的输出。
与之相反,其他层(几乎没有例外)忽略了输入的空间特征,将其视为"超大的一维向量(one big vector)",维度是Channel x Height x Width。
Convolution:
1.网络类型:Convolution
2.CPU版本实现:./src/caffe/layers/convolution_layer.cpp
3.GPU版本实现:./src/caffe/layers/convolution_layer.cu
4.参数(ConvolutionParameter convolution_param):
4.1 Required:
4.1.1 num_output(c_o):filters的数目或者说是卷积kernel的数目
4.1.2 kernel_size(Or kernel_h and kernel_w):每个卷积核的height和width
4.2 Strongly Recommended
4.2.1 weight_filler[default type:'constant' value 0]
4.3 Optional
4.3.1 bias_term[default true]:卷积输出是否加偏置 Wx + bias 中的 bias
4.3.2 pad(Or pad_h and pad_w)[default 0]:对上下左右四侧padding zero的行列数目 默认不padding
4.3.3 stride(Or stride_h and stride_w)[default 1]:指定filter的作用间隔 默认间隔1个像素
4.3.4 group(g)[default 1]:if g > 1:我们将限制每个filter只能连接到input的子集,即input和output的channels都被分到g个group,第i个output group的channels只能和第i个input group的channels相连接。
5.输入:n * c_i * h_i * w_i
6.输出:n * c_o * h_o * w_o, h_o = (h_i + 2*pad_h - kernel_h) / stride_h , w_o算法类似。
7.示例:
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" # learning rate and decay multipliers for the filters param { lr_mult: 1 decay_mult: 1 } # learning rate and decay multipliers for the biases param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 96 # learn 96 filters kernel_size: 11 # each filter is 11x11 stride: 4 # step 4 pixels between each filter application weight_filler { type: "gaussian" # initialize the filters from a Gaussian std: 0.01 # distribution with stdev 0.01 (default mean: 0) } bias_filler { type: "constant" # initialize the biases to zero (0) value: 0 } } }Convolution layer将input image用一组权值可通过反传调整的filter(即卷积核)进行卷积,每个卷积核都将生成一个feature map,多个feature map堆叠形成ouput。
Pooling:
1.网络类型:Pooling
2.CPU版本实现:./src/caffe/layers/pooling_layer.cpp
3.GPU版本实现:./src/caffe/layers/pooling_layer.cu
4.参数(PoolingParameter pooling_param):
4.1 Required:
4.1.1 kernel_size(Or kernel_h and kernel_w):每个卷积核的height和width
4.2 Optional
4.2.1 pool[default MAX]:pooling的方法,当前有MAX,AVE,or STOCHASTIC
4.2.2 pad(Or pad_h and pad_w)[default 0]:对上下左右四侧padding zero的行列数目 默认不padding
4.2.3 stride(Or stride_h and stride_w)[default 1]:指定filter的作用间隔 默认间隔1个像素
5.输入:n * c * h_i * w_i
6.输出:n * c * h_o * w_o, h_o = (h_i + 2*pad_h - kernel_h) / stride_h , w_o算法类似。
7.示例:
layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { pool: MAX kernel_size: 3 # pool over a 3x3 region stride: 2 # step two pixels (in the bottom blob) between pooling regions } }
1.网络类型:LRN
2.CPU版本实现:./src/caffe/layers/lrn_layer.cpp
3.GPU版本实现:./src/caffe/layers/lrn_layer.cu
4.参数(LRNParameter lrn_param):
4.1 Optional
4.1.1 local_size[default 5]:用于求和的channel的数目(对应于cross channel LRN)
或用于求和的方形区域的边界长度(对应于within channel LRN)
4.1.2 alpha[default 1]:缩放系数
4.1.3 beta[default 5]:指数
4.1.4 norm_region[default ACROSS_CHANNELS]:是对相邻channels求和(ACROSS_CHANNELS)还是在空间上对相邻位置求和(WITHIN_CHANNEL)
LRN层起到一种侧抑制的作用,通过对局部input区域的标准化。在ACROSS_CHANNELS mode,local region跨过相邻的channels,但是在空间维度保持不变(举例而言,维度为local_size x 1 x 1)。在WITHIN_CHANNEL mode,local region在空间维度进行扩展,但是channel仍保持独立(举例而言,维度为1 x local_size x local_size)。每一个input value都被除以(1+(alpha/n)*sum(x_i.^2))^beta,这里的n代表每个local region的大小,sum是对以该input value为中心的region进行求和(如果有需要的话需要进行zero padding)。
im2col:
Im2col是为了方便进行image-to-column变形的,具体细节无需了解。它被用在Caffe原始的convolution的矩阵乘法操作中,将patches转化成矩阵。