Deep learning 理解Caffe卷积层

Deep learning 理解Caffe卷积层,deep-learning,caffe,convolution,Deep Learning,Caffe,Convolution,我在Ubuntu下成功编译了Caffe,并开始研究如何定义和训练自己的网络。然而,我很难理解卷积层是如何产生输出的。例如,LeNet MNIST教程(,)的第二卷积层(conv2)有20个输入图像和50个输出图像: layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" param { lr_mult: 1 } param { lr_mult: 2 } con

我在Ubuntu下成功编译了Caffe,并开始研究如何定义和训练自己的网络。然而,我很难理解卷积层是如何产生输出的。例如,LeNet MNIST教程(,)的第二卷积层(conv2)有20个输入图像和50个输出图像:

layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
如何计算输出图像
O_0,…,O_49
?我的直觉是它是这样工作的(
I_I
input image,
K_j
kernels,
B_K
biass,
*
卷积算子):


这个假设正确吗?

在卷积层,内核(也称为过滤器)与输入特征映射卷积并生成输出特征映射。一组特征映射称为blob。每个内核都是一个三维对象,大小cxhxw。这里,C是平面或通道的数量,H是内核的高度,W是内核的宽度。通常,内核是正方形的,即内核的高度和宽度是相同的。通道或平面的数量或内核的深度应与输入特征映射或图像的数量相同。图像和一组核之间的卷积运算的输出称为特征映射。此外,特征映射和内核之间的后续卷积生成输出,也称为特征映射

如上所述,内核是一个3D数字数组。当内核在输入图像上滑动或卷积时,它将内核中的值与图像的原始像素值相乘。因此,内核数组的每个值都与图像的相应像素相乘。最后,将所有产品添加到一起,得到输出特征映射的一个值。然后内核以给定的步幅滑动,并再次启动该过程以生成输出特征映射的下一个值。一个内核生成一个称为特征映射的输出平面。因此N内核生成N特征映射。每个内核都有一个偏差元素,该元素添加到输出特征映射的每个值中。偏置元素的数量等于内核的数量

对于3 x 3 x 3内核,卷积计算如下:

这里的pqr取决于步幅

下面是一个动画,它很好地解释了这一点:

输入和输出特征映射之间的关系如下所示:

输入:
C_in=输入特征图中的通道数
H_in=输入特征图的高度
W_in=输入特征图的宽度

输出:
N_out=内核数
C_out=内核中的通道数
H_out=(H_in+2 x填充高度-内核高度)/步幅高度+1
W_out=(W_in+2 x填充宽度-内核宽度)/步幅宽度+1

所有C_out平面合并(累积)形成一个平面。因此,输出是一组N_out、H_out x W_out特征映射

以AlexNet为例:

第1层

输入数据(RGB图像):(3227227)
conv1内核:(96,3,11,11)
conv1输出:(96、55、55)

N=96,C=3,H=11,W=11
填充高度=0,填充宽度=0
步幅高度=4
步幅宽度=4

这里,每个(3 x 11 x 11)内核与(3 x 227 x 227)图像卷积,使得内核的每个通道与图像的对应通道卷积。您可以将其可视化为(11 x 11)遮罩,在(227 x 227)输入特征映射上卷积,以给出(55 x 55)输出特征映射。为每个内核获得这3个通道。此后,将不同通道的相应特征添加到一起,以给出一个(55 x 55)特征图。生成这样的96个特征图。因此,获得(96 x 55 x 55)输出blob

(55,55)=(227+2x0-11)/4+1,(227+2x0-11)/4+1)

ReLU

联营

标准化

第2层

输入特征图:(96、27、27)
conv2内核:(256,48,5,5)
conv2输出:(256、27、27)

N=256,C=48,H=5,W=5
填充高度=2,填充宽度=2
步幅高度=1
步幅宽度=1

这里,输入特征映射有96个通道,但内核只有48个通道。因此,输入特征图被分成两组(48 x 27 x 27)特征图。256(48 x 5 x 5)个内核也被分成两组128(48 x 5 x 5)个内核。此后,每组输入特征映射用一组128(48 x 5 x 5)个内核进行卷积。这将生成两组(48 x 27 x 27)要素图。这两套地图各有128张(48 x 27 x 27)特征地图。现在,每组的48个通道被合并以生成128(27 x 27)个特征图。因此,获得了2组128(27 x 27)特征图。这两个集合现在连接起来,以产生一个(256 x 27 x 27)输出blob

(27,27)=(27+2x2-5)/1+1,(27+2x2-5)/1+1)


注:卷积背后的数学在所有工具中都很常见,无论是Caffe、Keras、Tensorflow还是Torch。只是代码在每个实现中的优化不同。

在卷积层,内核(也称为过滤器)与输入特征映射卷积,并生成输出特征映射。一组特征映射称为blob。每个内核都是一个三维对象,大小cxhxw。这里,C是平面或通道的数量,H是内核的高度,W是内核的宽度。通常,内核是正方形的,即内核的高度和宽度是相同的。通道或平面的数量或内核的深度应与输入特征映射或图像的数量相同。一个映像和一组内核之间的卷积运算的输出
O_0 = I_0 * K_0 + ... + I_19 * K_19 + B_0
O_1 = I_0 * K_20 + ... + I_19 * K_39 + B_1
...
O_49 = I_0 * K_980 + ... + I_19 * K_999 + B_49