所有产品

深度学习中的各种卷积包括那些?

  这些,但是并不清楚它们实际意味着什么,本文就是带大家学习这些卷积到底是如何工作的。

  在本文中,我尽量使用简单明了的方式向大家解释深度学习中常用的几种卷积,希望能够帮助你建立学习体系,并为你的研究提供参考。

  在许多应用和网络架构中,我们经常想要做逆向的卷积,即要进行上采样。一些示例包括了图像高分辨率,需要将低维特征映射到高维空间,比如自动编码器或者语义分割。(对于语义分割,首先用编码器提取特征图,然后在解码器中恢复原始图像大小,这样来实现分类原始图像的每个像素。)

  更直接的,可以通过应用插值方案或手动创建规则来实现上采样。现在的一些结构,像神经网络,倾向于让网络自己学习正确的转换。要实现这一点,我们可以使用Transposed Convolution。

  但是“deconvolution”这个名字不太合适,因为Transposed Convolution毕竟不是信号/图像处理中定义的那种反卷积。从技术上讲,在信号/图像处理中deconvolution是反向的卷积操作。我们这里讲的不是这种情况。因为这,很多学者很反对将Transposed Convolution叫做deconvolution。下面我们会讲解,为什么将这种卷积操作叫做“Transposed Convolution”会更合适。

  我们可以使用直接卷积实现转置卷积。看下面图片中的例子,输入是2 x 2,填充2 x 2的0边缘,3 x 3的卷积核,stride=1。上采样输出大小是4 x 4。

  很有趣,通过填充和步长的调整,我们可以把同一张2 x 2的图像映射成不同大小的输出。下面,转置卷积应用在相同的2 x 2输入(在输入之间插入一个0)填充2 x 2边缘,stride=1。现在,输出大小为5 x 5。

  通过上面的例子了解转置卷积,可以帮我们建立直观的印象。但是要具体了解如何应用,就要看看在计算机中矩阵乘法是如何计算的。这样我们也可以看出,为什么Transposed Convolution是更好的名字。

  在卷积中,让我们定义C作为我们的卷积核,Large是输入图像,Small是卷积输出图像。完成卷积(矩阵乘法)后,我们下采样large图像,得到小的输出图像。卷积中的矩阵乘法满足C x Large=Small。

  下面的例子展示了该操作是怎么工作的。首先将输入变成一个16 x 1的矩阵,然后将Kernel转换成4 x 16的稀疏矩阵。在稀疏矩阵和变换后的输入间执行矩阵乘法。完成后,将得到的结果矩阵(4 x 1)转换回2 x 2输出。

  现在,如果我们在等式两边多次执行矩阵C转置,得到转置矩阵CT,使用矩阵与其转置矩阵的乘法给出单位矩阵的属性,得到如下的公式CT x Large=Small如下图:

  如你所见,我们执行了小图像到大图像的下采样。这也是我们想要得到的。现在你也明白“Transposed Convolution”的由来。

  直观地说,dilated convolutions通过在卷积核元素之间插入空格来“扩张”卷积核。扩充的参数取决于我们想如何扩大卷积核。具体实现可能会不同,但内核元素之间通常会插入l-1个空格。下面的图展示了,当kernel大小为l=1,2,4的时候。

  dilated convolutions的感受野,在没有增加消耗的情况下,能够观察到更大的感受野。

  在图中,3 x 3的红点表明,卷积后,输出图像是3x3像素。虽然三个卷积提供的输出具有相同的大小,但是模型的感受野却是不同的。当l=1时,感受野是3 x 3;l=2时,感受野是7 x7;当l=3时,感受野扩张到15 x 15。有趣的是,这些操作的相关参数数量基本相同。因此,dilated convolution被用来扩大输出的感受野,而不增加kernel的尺寸,当多个dilated convolution一个接一个堆叠时,这特别有效。

  一般卷积中,是3 x 3 kernel直接和图像卷积。而Spatially Separable Convolution中,首先是3 x 1的卷积核和图像卷积, 然后再是1 x 3卷积核操作。这样一来,只需要6个参数就可以搞定了,而相同的一般卷积操作需要9个参数。

  我们一起来看一个具体的例子,一个5 x 5的图像,3 x 3的卷积核(stride=1,padding=0),需要水平扫描三次,垂直扫描三次。有9个位置,可以看下图。在每个位置,9个元素要进行乘法。博马娱乐,所以总共是要执行9 x 9=81次乘法。

  我们可以来看看Spatially Separable Convolution中是怎么样的。我们首先应用3 x 1的filter在5 x 5图像上。那么应该是水平扫描5个位置,垂直扫描3个位置。那么总共应该是5 x 3=15个位置,如下方有黄点的图所示。在每个位置,完成3次乘法,总共是15 x 3=45次乘法。现在我们得到的是一个3 x 5的矩阵。然后再在3 x 5矩阵上应用1 x 3kernel,那么需要水平扫描3个位置和垂直扫描3个位置。总共9个位置,每个位置执行3次乘法,那么是9 x 3=27次,所以完成一次Spatially Separable Convolution总共是执行了45+27=72次乘法,这比一般卷积要少。

  当有的层,图像的尺寸N远远大于过滤器的尺寸m(Nm)时,上面的等式就可以简化为2/m。这意味着,在该种情况下,如果kernel大小为3 x 3,那么Spatially Separable Convolution的计算成本是传统卷积的2/3。

  虽然Spatially Separable Convolution可以节省成本,但是它却很少在深度学习中使用。最主要的原因是,不是所有的kernel都可以被分为两个更小的kernel的。如果我们将所有传统卷积用Spatially Separable Convolution替代,那么这将限制在训练过程中找到所有可能的kernels。找到的结果也许就不是最优的。

  现在让我们再来看看Depthwise Separable Convolution,这在深度学习中就应用得更多一些了。该卷积也是分两步,DW卷积和1 x 1卷积。

  在讲解这步骤之前,我们有必要回顾一下上面提到的2D卷积和1 x 1卷积。让我们快速过一下标准2D卷积。直接看具体的案例,输入的大小是7 x 7 x 3(高、宽、通道数)。卷积核大小3 x 3 x 3。完成2D卷积操作之后,输出是5 x 5 x 1(只有一个通道)。

  一般的,两个网络层之间会有多个过滤器。这里我们有128个过滤器。在应用128个2D卷积后,我们有128个5 x 5 x 1的输出特征图。我们然后将这些特征图堆叠到单层,大小为5 x 5 x 128。通过该操作,我们将输入(7 x 7 x 3)的转换成了5 x 5 x 128的输出。在空间上,高度和宽度都压缩了,但是深度拓展了。

  首先,我们将deothwise convolution应用到输入层。和使用单一3 x 3 x 3filter在2D卷积上不同,我们使用3个分开的kernel。每个kernel的尺寸是3 x 3 x 1。每个kernel只完成输入的单通道卷积。每个这样的卷积操作会得到一个5 x 5 x 1的特征图。然后,我们将三个特征图堆叠到一起,得到一个5 x 5 x 3的图像。操作结束,输出的大小为5 x 5 x 3。我们压缩了空间维度,但是输出的深度和输入是一样的。

  在现在的很多结构中,输出层都有相当多的通道。也就是说Nc往往远大于h。所以,如果是3 x 3的filter,那么2D卷积花的时间是depthwise separable convolution的9倍,如果是5 x 5的卷积核,将是25倍。

  depthwise separable convolution的劣势是什么呢?它减少了卷积的参数。如果是一个较小的模型,那么模型的空间将显著减小。这造成的结果就是,模型得到的结果并不是最优。