记录卷积神经网络(CNN)的卷积层,卷积核,池化层等概念和网络输入输出维度的计算方法。摘自《动手学深度学习》
卷积层的概念
卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。
虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cross-correlation)运算。实际上,卷积运算与互相关运算类似。为了得到卷积运算的输出,我们只需将核数组左右翻转并上下翻转,再与输入数组做互相关运算。其实,在深度学习中核数组都是学出来的:卷积层无论使用互相关运算或卷积运算都不影响模型预测时的输出。因为假如使用卷积运算学出的核数组按上下、左右翻转,在利用该核数组做卷积运算时,依然会得出和互相关一样的输出(负负得正和正正得正)。以后说卷积其实指的是互相关运算。
卷积层的运算
最简单的二维卷积层
如上图,输入是一个高和宽均为3的二维数组(通道为1)。我们将该数组的形状记为3×3或(3,3)。核数组的高和宽分别为2。该数组在卷积计算中又称卷积核或过滤器(filter)。卷积核窗口(又称卷积窗口)的形状取决于卷积核的高和宽,即2×2。图中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+1×1+3×2+4×3=19。
二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。卷积层的模型参数包括了卷积核和标量偏差。在训练模型的时候,通常我们先对卷积核随机初始化,然后不断迭代卷积核和偏差。
多输入通道和多输出通道
前面用到的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是$h$和$w$(像素),那么它可以表示为一个$3×ℎ×𝑤$的多维数组。我们将大小为3的这一维称为通道(channel)维。
多输入通道
如上图:当输入数据含多个通道时,我们需要构造一个输入通道数与输入数据的通道数相同的卷积核,从而能够与含多通道的输入数据做互相关运算。假设输入数据的通道数为$𝑐_𝑖$,那么卷积核的输入通道数同样为$𝑐_𝑖$。设卷积核窗口形状为$𝑘_ℎ×𝑘_𝑤$。当$𝑐_𝑖=1$时,我们知道卷积核只包含一个形状为$𝑘_ℎ×𝑘_𝑤$的二维数组。当$𝑐_𝑖>1$时,我们将会为每个输入通道各分配一个形状为$𝑘_ℎ×𝑘_𝑤$的核数组。把这$𝑐_𝑖$个数组在输入通道维上连结,即得到一个形状为$𝑐_𝑖×𝑘_ℎ×𝑘_𝑤$的卷积核。由于输入和卷积核各有$𝑐_𝑖$个通道,我们可以在各个通道上对输入的二维数组和卷积核的二维核数组做互相关运算,再将这$𝑐_𝑖$个互相关运算的二维输出按通道相加,得到一个二维数组。这就是含多个通道的输入数据与多输入通道的卷积核做二维互相关运算的输出。
多输出通道
当输入通道有多个时,因为我们对各个通道的结果做了累加,所以不论输入通道数是多少,输出通道数总是为1。设卷积核输入通道数和输出通道数分别为$𝑐_𝑖$和$𝑐_𝑜$,高和宽分别为$𝑘_ℎ$和$𝑘_𝑤$。如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为$𝑐_𝑖×𝑘_ℎ×𝑘_𝑤$的核数组。将它们在输出通道维上连结,卷积核的形状即$𝑐_𝑜×𝑐_𝑖×𝑘_ℎ×𝑘_𝑤$。在做互相关运算时,每个输出通道上的结果由卷积核在该输出通道上的核数组与整个输入数组计算而来。
总结就是:输入的通道数$c_i$取决于卷积核的通道数,输出的通道数$c_o$取决于卷积核的个数。
1×1卷积层
最后我们讨论卷积窗口形状为1×1($𝑘_ℎ=𝑘_𝑤=1$)的多通道卷积层。我们通常称之为1×1卷积层,并将其中的卷积运算称为1×1卷积。因为使用了最小窗口,1×1卷积失去了卷积层可以识别高和宽维度上相邻元素构成的模式的功能。实际上,1×1卷积的主要计算发生在通道维上。图中展示了使用输入通道数为3、输出通道数为2的1×1卷积核的互相关计算。值得注意的是,输入和输出具有相同的高和宽。输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道之间的按权重累加。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1×1卷积层的作用与全连接层等价。
特征图和感受野
二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素$x$的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做$x$的感受野(receptive field)。如图: 输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们将图中形状为2×2的输出记为$Y$,并考虑一个更深的卷积神经网络:将$Y$与另一个形状为2×2的核数组做互相关运算,输出单个元素$z$。那么,$z$在$Y$上的感受野包括$Y$的全部四个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。
填充和步幅
填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。卷积神经网络经常使用奇数高宽的卷积核,如1、3、5和7,使得两端上的填充个数相等。
在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅(stride)。我们可以使用更大步幅。下图展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。
卷积运算的输出形状的计算公式:
$$ \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor. $$ 该输出的通道数取决于参与运算的卷积核的个数。
池化层
但实际图像里,我们感兴趣的物体不会总出现在固定位置:即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移。这会导致同一个边缘对应的输出可能出现在卷积输出Y中的不同位置,进而对后面的模式识别造成不便。而池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。
同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。
二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。池化窗口形状为$𝑝×𝑞$的池化层称为$𝑝×𝑞$池化层,其中的池化运算叫作$𝑝×𝑞$池化。
填充和步幅
同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。
多通道
在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。
池化层小结
- 最大池化和平均池化分别取池化窗口中输入元素的最大值和平均值作为输出。
- 池化层的一个主要作用是缓解卷积层对位置的过度敏感性。
- 可以指定池化层的填充和步幅。
- 池化层的输出通道数跟输入通道数相同。