vision layer 特征表达层
Header:
./include/caffe/vision_layers.hpp
特征表达层通常将图像作为输入,并产生其他图像作为输出。
vision_layer
主要是图像卷积的操作,像convolusion、pooling、LRN都在里面。
典型“image”可以是灰度图像中的一个颜色通道(c = 1)或者如在RGB(红色,绿色,蓝色)中的三个颜色通道(c = 3 )。
但在caffe中,图像是一个广义的概念,区别特征是其空间结构:通常图像的h>1,w>1, 高和宽通常均大于 1而通道数不限,类似结构的数据均可理解为图像
。
大多数视觉层通常是在输入数据的某块区域执行特定操作来产生对应的输出。
相比之下,其他层(有少数例外)忽略输入的空间结构, 而是把输入图像
当作是维度为chw的“一个大向量”
卷积层
- CPU implementation:
./src/caffe/layers/convolution_layer.cpp
- CUDA GPU implementation:
./src/caffe/layers/convolution_layer.cu
参数
Required(必须的参数)
num_output
(c_o
): 指定卷积核的数量
kernel_size
(orkernel_h
andkernel_w
):指定每个卷积核的高度和宽度
Strongly Recommended(强力推荐)
- weight_filler [default
type: 'constant' value: 0
]:参数的初始化方法
Optional(可选的)
bias_term
[defaulttrue
]: 指定是否学习并将一组加性偏差应用于滤波器输出 指定是否给卷积输出添加偏置项
-
pad
(orpad_h
andpad_w
) [default 0]: 指定在输入的每一边加上多少个像素 指定在输入图像周围补 0 的像素个数
-
stride
(orstride_h
andstride_w
) [default 1]: 指定过滤器的步长 指定卷积核在输入 图像上滑动的步长
group
(g) [default 1]: ( 指定分组卷积操作的组数,默认为 1 即不分组)If g > 1, 我们可以将卷积核的连接限制为输入数据的一个子集。 具体地说, 输入图像和输出图像在通道维度上分别被分成 g 个组, 输出图像的第 i 组只与输入图像第 i 组连接( 即输入图像的第 i 组与相应的卷积核卷积得到第 i组输出)。
输入
n * c_i * h_i * w_i
输出
n * c_o * h_o * w_o
, whereh_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1
andw_o
likewise.
例子(
./models/bvlc_reference_caffenet/train_val.prototxt
)
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
# 卷积核的局部学习率和权值衰减因子
param { lr_mult: 1 decay_mult: 1 }
# 偏置项的局部学习率和权值衰减因子
param { lr_mult: 2 decay_mult: 0 }
convolution_param {
convolution_param {
num_output: 96 # 学习 96 组卷积核
kernel_size: 11 # 卷积核大小为 11x11
stride: 4 # 卷积核滑动步长为 4
weight_filler {
type: "gaussian" # 使用高斯分布随机初始化卷积核
std: 0.01 # 高斯分布的标准差为 0.01 (默认均值: 0)
}
bias_filler {
bias_filler {
type: "constant" # 使用常数 0 初始化偏置项 0
value: 0
}
}
}
}
}
卷积层使用一系列可训练的卷积核对输入图像进行卷积操作,每组卷积核生成输出图像中的一个特征图。
池化层
- CPU implementation:
./src/caffe/layers/pooling_layer.cpp
- CUDA GPU implementation:
./src/caffe/layers/pooling_layer.cu
参数
Required(必须的参数)
kernel_size
(orkernel_h
andkernel_w
):指定池化窗口的高度和宽度
Optional(可选的)
pool
[default MAX]: 池化方法。目前有 MAX AVE STOCHASTIC 三种方法( 最大值池化, 均值池化,和 随机池化)
-
pad
(orpad_h
andpad_w
) [default 0]: 指定在输入的每一边加上多少个像素 指定在输入图像周围补 0 的像素个数
-
stride
(orstride_h
andstride_w
) [default 1]: 指定过滤器的步长 指定池化窗口在输入数据上滑动的步长
输入
n * c * h_i * w_i
输出
n * c * h_o * w_o
, whereh_o and w_o are computed in the same way as convolution.
例子(
./models/bvlc_reference_caffenet/train_val.prototxt
)
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3 # 池化窗口大小为 3x3
stride: 2 # 池化窗口在输入图像上滑动的步长为 2
}
}
}
Local Response Normalization (LRN) 局部相应归一化层
局部响应值归一化层通过对输入数据的局部归一操作执行了一种“侧抑制”的机制。
滤波器后面接非线性算法影响识别率,
局部归一化层也会增加性能,因为它可以使监督学习算法更快,也许是因为所有的变量都具有相似的方差了(与其他白化和去相关的方法的优点一样),这样会加快收敛速度。
有两种不同的形式,一种的输入区域为相邻的channels(across channel LRN),另一种是为同一个channel内的空间区域(within channel LRN):
在ACROSS_CHANNELS模式下(
通道间归一化模式)中,局部区域范围在相邻通道间,但没有空间扩展(即局部区域的尺寸为 local_size x 1 x 1);
在 WITHIN_CHANNEL 模式下(
通道内归一化模式)中,局部区域在空间上扩展,但只针对独立通道进行(即尺寸为 1 x local_size x local_size);
计算公式:对每一个输入除以,
其中
n
为局部尺寸大小local_size 在以当前输入值为中心的区域内计算加和,
alpha和beta前面已经定义。
- CPU Implementation:
./src/caffe/layers/lrn_layer.cpp
- CUDA GPU Implementation:
./src/caffe/layers/lrn_layer.cu
参数
Optional(可选的)
local_size
[default 5]::两种表示(1)通道间归一化时表示求和的通道数;(2)通道内归一化时表示求和方形区域的边长;默认值为5;
alpha
[default 1]: 缩放参数 (see below)
beta
[default 5]: 指数 (see below)
norm_region
[defaultACROSS_CHANNELS
]:选择对相邻通道间归一化还是通道内空间区域归一化,默认为ACROSS_CHANNELS,即通道间归一化;另一种为WITHIN_CHANNEL(在通道间指的是沿着通道维度操作,通道内指的是在特征图的二维平面内操作)
im2col
- Im2col 是一个辅助操作, 用来实现图像到“列向量”的转换。
- Im2col 用在 CAFFE 早期卷积的矩阵乘法中,即将所有图像块组成一个矩阵。
在caffe中,执行卷积操作时,将图像中与卷积核作用的图像块写成列向量,然后将这些列向量按行的方向依次排开组成一个二维的矩阵,同时,每组卷积核写成一个行向量,多个输出通道对应的多组卷积核按列的方向依次排开形成一个二维矩阵,这样,卷积操作就转化为矩阵乘法操作。