Caffe 初学拾遗(七) Layer Catalogue (Vision Layer)

时间:2022-11-21 04:12:24

{承接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
  }
}


Local Response Normalization(LRN):

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转化成矩阵。