conv-layer

  • 二维卷积层
  • 二维互相关运算
  • 特征图和感受野
  • 填充和步幅
  • 填充
  • 步幅


二维卷积层

卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度,常用来处理图像数据。本节中,我们将介绍简单形式的二维卷积层的工作原理。

二维互相关运算

虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cross-correlation)运算。在二维卷积层中,一个二维输入数组和一个二维核(kernel)数组通过互相关运算输出一个二维数组。我们用一个具体例子来解释二维互相关运算的含义。如图5.1所示,输入是一个高和宽均为3的二维数组。我们将该数组的形状记为在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积或(3,3)。核数组的高和宽分别为2。该数组在卷积计算中又称卷积核或过滤器(filter)。卷积核窗口(又称卷积窗口)的形状取决于卷积核的高和宽,即在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_02。图5.1中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_03

在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_04


在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。图中的输出数组高和宽分别为2,其中的4个元素由二维互相关运算得出:

在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_05

特征图和感受野

二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积_06的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积_06的感受野(receptive field)。以上图为例,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们将图中形状为在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_02的输出记为在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_09,并考虑一个更深的卷积神经网络:将在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_09与另一个形状为在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_02的核数组做互相关运算,输出单个元素在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_12。那么,在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_12在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_09上的感受野包括在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_09的全部四个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。

我们常使用“元素”一词来描述数组或矩阵中的成员。在神经网络的术语中,这些元素也可称为“单元”。

填充和步幅

我们使用高和宽为3的输入与高和宽为2的卷积核得到高和宽为2的输出。一般来说,假设输入形状是在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_16,卷积核窗口形状是在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_17,那么输出形状将会是

在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_18

所以卷积层的输出形状由输入形状和卷积核窗口形状决定。我们将介绍卷积层的两个超参数,即填充和步幅。它们可以对给定形状的输入和卷积核改变输出形状。

填充

填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。下图里我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。图5.2中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_19

在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_20

一般来说,如果在高的两侧一共填充在pytorch中三维卷积如何实现 pytorch 二维卷积_pytorch_21行,在宽的两侧一共填充在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_22列,那么输出形状将会是

在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_23

也就是说,输出的高和宽会分别增加在pytorch中三维卷积如何实现 pytorch 二维卷积_pytorch_21在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_22

在很多情况下,我们会设置在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_26在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_27来使输入和输出具有相同的高和宽。这样会方便在构造网络时推测每个层的输出形状。假设这里在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_28是奇数,我们会在高的两侧分别填充在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积_29行。如果在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_28是偶数,一种可能是在输入的顶端一侧填充在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_31行,而在底端一侧填充在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_32行。在宽的两侧填充同理。

卷积神经网络经常使用奇数高宽的卷积核,如1、3、5和7,所以两端上的填充个数相等。对任意的二维数组X,设它的第i行第j列的元素为X[i,j]。当两端上的填充个数相等,并使输入和输出具有相同的高和宽时,我们就知道输出Y[i,j]是由输入以X[i,j]为中心的窗口同卷积核进行互相关计算得到的。

步幅

卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅(stride)。

目前我们看到的例子里,在高和宽两个方向上步幅均为1。我们也可以使用更大步幅。下图展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。图5.3中的阴影部分为输出元素及其计算所使用的输入和核数组元素:在pytorch中三维卷积如何实现 pytorch 二维卷积_pytorch_33在pytorch中三维卷积如何实现 pytorch 二维卷积_深度学习_34

在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积_35

一般来说,当高上步幅为在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积_36,宽上步幅为在pytorch中三维卷积如何实现 pytorch 二维卷积_pytorch_37时,输出形状为

在pytorch中三维卷积如何实现 pytorch 二维卷积_卷积_38

如果设置在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_26在pytorch中三维卷积如何实现 pytorch 二维卷积_在pytorch中三维卷积如何实现_27,那么输出形状将简化为在pytorch中三维卷积如何实现 pytorch 二维卷积_二维_41。更进一步,如果输入的高和宽能分别被高和宽上的步幅整除,那么输出形状将是在pytorch中三维卷积如何实现 pytorch 二维卷积_pytorch_42