从本质上讲,卷积的计算过程其实同全连接一样,也是各个神经元之间的线性组合。只是卷积操作在进行线性组合时选择的是特定位置上的神经元。下面我们首先通过一张动图来直观感受一下卷积的过程。
如图所示,**卷积操作其实就是每次取一个特定大小的矩阵F(蓝色矩阵中的阴影部分),然后将其对输入X(图中蓝色矩阵)依次扫描并进行内积的运算过程。可以看到,阴影部分每移动一个位置就会计算得到一个卷积值(绿色矩阵中的阴影部分),当F扫描完成后就得到了整个卷积后的结果Y(绿色矩阵)。
同时,我们将这个特定大小的矩阵F称为卷积核,即convolutional kernel或kernel或filter或detector,它可以是一个也可以是多个;将卷积后的结果Y称为特征图,即feature map,并且每一个卷积核卷积后都会得到一个对应的特征图;最后,对于输入X)的形状,都会用三个维度来进行表示,即宽(width),高(high)和通道(channel)。例如图中输入X的形状为[7,7,1]
。
注意,在上面笔者提到了卷积核的个数还可以是多个,那我们为什么需要多个卷积核进行卷积呢?在上一篇文章中我们介绍到:对于一个卷积核,可以认为其具有识别某一类元素(特征)的能力;而对于一些复杂的数据来说,仅仅只是通过一类特征来进行辨识往往是不够的。因此,通常来说我们都会通过多个不同的卷积核来对输入进行特征提取得到多个特征图,然再输入到后续的网络中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sxW7Pj67-1657026201641)(https://vdn1.vzuu.com/SD/d64a45c6-ec4a-11ea-acfd-5ab503a75443.mp4?disable_local_cache=1&bu=078babd7&c=avc.0.0&f=mp4&expiration=1653035766&auth_key=1653035766-0-0-efb78e5addfa03be68c1bf73f4a28bd9&v=hw&pu=078babd7)]
对于同一个输入,通过两个不同的卷积核对其进行卷积特征提取,最后便能得到两个不同的特征图。从图右边的特征图可以发现,上面的特征图在锐利度方面明显会强于下面的特征图。当然,这也是使用多卷积核进行卷积的意义,探测到多种特征属性以有利于后续的下游任务。
到此为止, 对于卷积的原理和意义就算是交待完了,并且通过这些动态图片的展示,我们也有了更为直观的了解。但所谓数无形时少直觉,形少数时难入微。因此,下面我们就以单通道(灰度图)和三通道的输入来实际计算一下整个卷积的过程。
如下图所示,现在有一张形状为[5,5,1]
的灰度图,我们需要用图3右边的卷积核对其进行卷积处理,同时再考虑到偏置的作用。那么其计算过程是怎么样的呢?
如下图所示,右边为卷积后的特征图(feature map),左边为卷积核对输入图片左上放进行卷积时的示意图。因此,对于这个部分的计算过程有:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncqzrtfB-1657026201643)(https://www.zhihu.com/equation?tex=%5Cunderbrace%7B1%5Ccdot0%2B2%5Ccdot0%2B0%5Ccdot1-1%5Ccdot0%2B1%5Ccdot1%2B0%5Ccdot1%2B2%5Ccdot1-1%5Ccdot0-2%5Ccdot1%7D_%7Bkernel%7D%5Cunderbrace%7B%5C%3B%5C%3B%2B1%5C%3B%5C%3B%7D_%7Bbias%7D%3D2%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%281%29+%5C%5C)]
同理,对于最右下角部分卷积计算过程有:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3uDLBosk-1657026201647)(https://www.zhihu.com/equation?tex=2%5Ccdot0%2B1%5Ccdot0%2B0%5Ccdot1%2B0%5Ccdot0%2B0%5Ccdot1%2B0%5Ccdot1-1%5Ccdot1%2B0%5Ccdot0-0%5Ccdot1%2B1%3D0%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%282%29+%5C%5C)]
因此,对于最后卷积的结果,我们得到的将是一个如上图右边所示形状为[3,3,1]
的特征图。到此我们就把单通道单卷积的计算过程介绍完了。下面我们再来看单通道多卷积核的例子。
如下图所示,左边依旧为输入矩阵,我们现在要用右边所示的两个卷积核对其进行卷积处理。
以右侧的卷积核为例,其计算过程如下图所示:
最后我们便能得到如下右边所示的,形状为[3,3,2]
的卷积特征图,其中2表示两个特征通道。
到此,对于单通道的卷积计算过程就介绍完了。但通常情况下,我们遇到得更多的就是对多通道的输入进行卷积处理,例如包含有RGB三个通道的彩色图片等。接下来,笔者就开始介绍多通道的卷积计算过程。
对于多通道的卷积过程,总体上还是还是同之前的一样,都是每次选取特定位置上的神经元进行卷积,然后依次移动直到卷积结束。下面我们先来看看多通道单卷积核的计算过程。
如图所示,左边为包含有三个通道的输入,右边为一个卷积核和一个偏置。注意,强调一下右边的仅仅只是一个卷积核,不是三个。笔者看到不少人在这个地方都会搞错。因为输入是三个通道,所以在进行卷积的时候,对应的每一个卷积核都必须要有三个通道才能进行卷积。下面我们就来看看具体的计算过程。
如图所示,右边为卷积后的特征图(feature map),左边为一个三通道的卷积核对输入图片左上放进行卷积时的示意图。因此,对于这个部分的计算过程有:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASkLxUuw-1657026201660)(https://www.zhihu.com/equation?tex=%5Cbegin%7Baligned%7D+%26%5Cunderbrace%7B%280%5Ccdot2%2B2%5Ccdot0%2B0%5Ccdot0%2B0%5Ccdot1%2B2%5Ccdot0%2B0%5Ccdot1%2B2%5Ccdot0%2B1%5Ccdot3%2B2%5Ccdot0%29%7D_%7Bchannel+%5C%3B1%7D%5C%5C+%2B%26+%5Cunderbrace%7B%280%5Ccdot1%2B0%5Ccdot0%2B0%5Ccdot1%2B1%5Ccdot0%2B0%5Ccdot0%2B0%5Ccdot0%2B1%5Ccdot1%2B0%5Ccdot1%2B0%5Ccdot1%29%7D_%7Bchannel%5C%3B2%7D%5C%5C+%2B%26+%5Cunderbrace%7B%281%5Ccdot0%2B1%5Ccdot0%2B0%5Ccdot1%2B0%5Ccdot1%2B1%5Ccdot1%2B0%5Ccdot1%2B0%5Ccdot1%2B1%5Ccdot1%2B1%5Ccdot0%29%7D_%7Bchannel+3%7D%5C%5C+%2B%26%5Cunderbrace%7B%5C%3B%5C%3B1%5C%3B%5C%3B%7D_%7B%5C%3B%5C%3Bbias%5C%3B%5C%3B%7D%5C%5C+%3D%263%2B1%2B2%2B1%3D7+%5Cend%7Baligned%7D%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%5C%3B%283%29+%5C%5C)]
同理,对于其它部分的卷积计算过程也类似于上述计算步骤。由此我们便能得到如图10右边所示卷积后的形状为[3,3,1]
的特征图。
在介绍完多通道单卷积核的计算过程后,我们再来看看多通道多卷积核的计算过程。
如图所示,左边依旧为输入矩阵,我们现在要用右边所示的两个卷积核对其进行卷积处理。对于第二个卷积核,其计算过程也和式子(3)类似,都是将每个通道上的卷积结果进行相加,最后再加上偏置。因此,最后我们便能得到如图12右边所示的,形状为[3,3,2]
的卷积特征图,其中2表示两个特征通道。
同时,从上面单通道卷积核多通道卷积的计算过程可以发现:
(1)原始输入有多少个通道,其对应的一个卷积核就必须要有多少个通道,这样才能与输入进行匹配,也才能完成卷积操作。换句话说,如果输入数据的形状为[n,n,c]
,那么对应每个卷积核的通道数也必须为c
。
(2)用k
个卷积核对输入进行卷积处理,那么最后得到的特征图一定就会包含有k
个通道。例如,输入为[n,n,c]
,且用k
个卷积核对其进行卷积,则卷积核的形状必定为[w1,w2,c,k]
,最终得到的特征图形状必定为[h1,h2,k]
;其中w1,w2
为卷积核的宽度,h1,h2
为卷积后特征图的宽度。