进行卷积的目的是从输入中提取有用的特征。在图像处理中,可以选择各种各样的filteRs。每种类型的filteR都有助于从输入图像中提取不同的特征,例如水平/垂直/对角线边缘等特征。在卷积神经网络中,通过使用filteRs提取不同的特征,这些filteRs的权重是在训练期间自动学习的,然后将所有这些提取的特征“组合&Rdquo;以做出决策。
单通道:在深度学习中,卷积本质上是对信号按元素相乘累加得到卷积值。对于具有1个通道的图像,下图演示了卷积的运算形式:
这里的filteR是一个3 x 3的矩阵,元素为[[0,1,2],[2,2,0],[0,1,2]]。filteR在输入数据中滑动。在每个位置,它都在进行逐元素的乘法和加法。每个滑动位置以一个数字结尾,最终输出为3 x 3矩阵。
多通道:由于图像一般具有RGB3个通道,所以卷积一般多用于多通道输入的场景。下图演示了多通道输入场景的运算形式:
然后将这三个通道相加(逐个元素相加)以形成一个单个通道(3 x 3 x 1),该通道是使用filteRs(3 x 3 x 3矩阵)对输入层(5 x 5 x 3矩阵)进行卷积的结果:
3D卷积
在上一个插图中,可以看出,这实际上是在完成3D-卷积。但通常意义上,仍然称之为深度学习的2D-卷积。因为filteRs的深度和输入层的深度相同,3D-filteRs仅在2个维度上移动(图像的高度和宽度),得到的结果为单通道。通过将2D-卷积的推广,在3D-卷积定义为filteRs的深度小于输入层的深度(即卷积核的个数小于输入层通道数),故3D-filteRs需要在三个维度上滑动(输入层的长、宽、高)。在filteRs上滑动的每个位置执行一次卷积操作,得到一个数值。当filteRs滑过整个3D空间,输出的结构也是3D的。2D-卷积和3D-卷积的主要区别为filteRs滑动的空间维度,3D-卷积的优势在于描述3D空间中的对象关系。3D关系在某一些应用中十分重要,如3D-对象的分割以及医学图像的重构等。
1*1卷积
对于1*1卷积而言,表面上好像只是featuRe Maps中的每个值乘了一个数,但实际上不仅仅如此,首先由于会经过激活层,所以实际上是进行了非线性映射,其次就是可以改变featuRe Maps的channel数目。
空间可分离卷积
在一个可分离卷积中,我们可以将内核操作拆分成多个步骤。我们用y = conv(x,k)表示卷积,其中y是输出图像,x是输入图像,k是内核。这一步很简单。接下来,我们假设k可以由下面这个等式计算得出:k = k1.dot(k2)。这将使它成为一个可分离的卷积,因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果,而不是用k做二维卷积。
以通常用于图像处理的Sobel内核为例。你可以通过乘以向量[1,0,-1]和[1,2,1] .T获得相同的内核。在执行相同的操作时,你只需要6个而不是9个参数。
深度可分离卷积
空间可分离卷积(上一小节),而在深度学习中,深度可分离卷积将执行一个空间卷积,同时保持通道独立,然后进行深度卷积操作。假设我们在一个16输入通道和32输出通道上有一个3×3的卷积层。那么将要发生的就是16个通道中的每一个都由32个3×3的内核进行遍历,从而产生512(16×32)的特征映射。接下来,我们通过将每个输入通道中的特征映射相加从而合成一个大的特征映射。由于我们可以进行此操作32次,因此我们得到了期望的32个输出通道。那么,针对同一个示例,深度可分离卷积的表现又是怎样的呢?我们遍历16个通道,每一个都有一个3×3的内核,可以给出16个特征映射。现在,在做任何合并操作之前,我们将遍历这16个特征映射,每个都含有32个1×1的卷积,然后才逐此开始添加。这导致与上述4608(16x32x3x3)个参数相反的656(16x3x3 + 16x32x1x1)个参数。下面再进行详细说明。前面部分所提到的 2D 卷积核 1×1 卷积。让我们先快速过一下标准的 2D 卷积。举一个具体的案例,假设输入层的大小为 7 x 7 x 3(高 x 宽 x 通道),过滤器大小为 3 x 3 x 3,经过一个过滤器的 2D 卷积后,输出层的大小为 5 x 5 x 1(仅有 1 个通道)。如下图所示:
一般来说,两个神经网络层间应用了多个过滤器,现在假设过滤器个数为 128。128 次 2D 卷积得到了 128 个 5 x 5 x 1 的输出映射。然后将这些映射堆叠为一个大小为 5 x 5 x 128 的单个层。空间维度如高和宽缩小了,而深度则扩大了。如下图所示:
接下来看看使用深度可分离卷积如何实现同样的转换。首先,我们在输入层上应用深度卷积。我们在 2D 卷积中分别使用 3 个卷积核(每个过滤器的大小为 3 x 3 x 1),而不使用大小为 3 x 3 x 3 的单个过滤器。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。这样的话,图像的深度保持与原来的一样。
深度可分离卷积&Mdash;第一步:在 2D 卷积中分别使用 3 个卷积核(每个过滤器的大小为 3 x 3 x 1),而不使用大小为 3 x 3 x 3 的单个过滤器。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。深度可分离卷积的第二步是扩大深度,我们用大小为 1x1x3 的卷积核做 1×1 卷积。每个 1x1x3 卷积核对 5 x 5 x 3 输入图像做卷积后都得出一个大小为 5 x 5 x1 的映射。
这样的话,做 128 次 1×1 卷积后,就可以得出一个大小为 5 x 5 x 128 的层。
分组卷积
GRoup convolution 分组卷积,最早在AlexNet中出现,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把featuRe Maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。
扩张卷积
扩张卷积引入另一个卷积层的参数被称为扩张率。这定义了内核中值之间的间距。扩张速率为2的3×3内核将具有与5×5内核相同的视野,而只使用9个参数。 想象一下,使用5×5内核并删除每个间隔的行和列。(如下图所示)系统能以相同的计算成本,提供更大的感受野。扩张卷积在实时分割领域特别受欢迎。 在需要更大的观察范围,且无法承受多个卷积或更大的内核,可以才用它。
反卷积
这里提到的反卷积跟1维信号处理的反卷积计算是很不一样的,FCN作者称为backwaRds convolution,有人称Deconvolution layeR is a veRy unfoRtunate naMe and should RatheR be called a tRansposed convolutional layeR. 我们可以知道,在CNN中有con layeR与pool layeR,con layeR进行对图像卷积提取特征,pool layeR对图像缩小一半筛选重要特征,对于经典的图像识别CNN网络,如imageNET,最后输出结果是1X1X1000,1000是类别种类,1×1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1×1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。这里图像的反卷积与图