卷积有多少种?一文读懂深度学习中的各类卷积

https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9362042095475795423%22%7D&n_type=1&p_from=4网络

 

本文目录架构

1.卷积与互相关ide

2.深度学习中的卷积(单通道版本,多通道版本)函数

3.3D 卷积性能

4.1×1 卷积学习

5.卷积算术优化

6.转置卷积(去卷积、棋盘效应)编码

7.扩张卷积spa

8.可分卷积(空间可分卷积,深度可分卷积)3d

9.平展卷积

10.分组卷积

11.混洗分组卷积

12.逐点分组卷积

1、卷积与互相关

在信号处理、图像处理和其它工程/科学领域,卷积都是一种使用普遍的技术。在深度学习领域,卷积神经网络(CNN)这种模型架构就得名于这种技术。可是,深度学习领域的卷积本质上是信号/图像处理领域内的互相关(cross-correlation)。这两种操做之间存在细微的差异。

无需太过深刻细节,咱们就能看到这个差异。在信号/图像处理领域,卷积的定义是:

其定义是两个函数中一个函数通过反转和位移后再相乘获得的积的积分。下面的可视化展现了这一思想:

信号处理中的卷积。过滤器 g 通过反转,而后再沿水平轴滑动。在每个位置,咱们都计算 f 和反转后的 g 之间相交区域的面积。这个相交区域的面积就是特定位置出的卷积值。

这里,函数 g 是过滤器。它被反转后再沿水平轴滑动。在每个位置,咱们都计算 f 和反转后的 g 之间相交区域的面积。这个相交区域的面积就是特定位置出的卷积值。

另外一方面,互相关是两个函数之间的滑动点积或滑动内积。互相关中的过滤器不通过反转,而是直接滑过函数 f。f 与 g 之间的交叉区域便是互相关。下图展现了卷积与互相关之间的差别。

信号处理中卷积与互相关之间的差别

在深度学习中,卷积中的过滤器不通过反转。严格来讲,这是互相关。咱们本质上是执行逐元素乘法和加法。但在深度学习中,直接将其称之为卷积更加方便。这没什么问题,由于过滤器的权重是在训练阶段学习到的。若是上面例子中的反转函数 g 是正确的函数,那么通过训练后,学习获得的过滤器看起来就会像是反转后的函数 g。所以,在训练以前,不必像在真正的卷积中那样首先反转过滤器。

2、3D 卷积

在上一节的解释中,咱们看到咱们其实是对一个 3D 体积执行卷积。但一般而言,咱们仍在深度学习中称之为 2D 卷积。这是在 3D 体积数据上的 2D 卷积。过滤器深度与输入层深度同样。这个 3D 过滤器仅沿两个方向移动(图像的高和宽)。这种操做的输出是一张 2D 图像(仅有一个通道)。

很天然,3D 卷积确实存在。这是 2D 卷积的泛化。下面就是 3D 卷积,其过滤器深度小于输入层深度(核大小<通道大小)。所以,3D 过滤器能够在全部三个方向(图像的高度、宽度、通道)上移动。在每一个位置,逐元素的乘法和加法都会提供一个数值。由于过滤器是滑过一个 3D 空间,因此输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。

在 3D 卷积中,3D 过滤器能够在全部三个方向(图像的高度、宽度、通道)上移动。在每一个位置,逐元素的乘法和加法都会提供一个数值。由于过滤器是滑过一个 3D 空间,因此输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。

与 2D 卷积(编码了 2D 域中目标的空间关系)相似,3D 卷积能够描述 3D 空间中目标的空间关系。对某些应用(好比生物医学影像中的 3D 分割/重构)而言,这样的 3D 关系很重要,好比在 CT 和 MRI 中,血管之类的目标会在 3D 空间中蜿蜒曲折。

3、转置卷积(去卷积)

对于不少网络架构的不少应用而言,咱们每每须要进行与普通卷积方向相反的转换,即咱们但愿执行上采样。例子包括生成高分辨率图像以及将低维特征图映射到高维空间,好比在自动编码器或形义分割中。(在后者的例子中,形义分割首先会提取编码器中的特征图,而后在解码器中恢复原来的图像大小,使其能够分类原始图像中的每一个像素。)

实现上采样的传统方法是应用插值方案或人工建立规则。而神经网络等现代架构则倾向于让网络本身自动学习合适的变换,无需人类干预。为了作到这一点,咱们可使用转置卷积。

转置卷积在文献中也被称为去卷积或 fractionally strided convolution。可是,须要指出「去卷积(deconvolution)」这个名称并非很合适,由于转置卷积并不是信号/图像处理领域定义的那种真正的去卷积。从技术上讲,信号处理中的去卷积是卷积运算的逆运算。但这里却不是这种运算。所以,某些做者强烈反对将转置卷积称为去卷积。人们称之为去卷积主要是由于这样说很简单。后面咱们会介绍为何将这种运算称为转置卷积更天然且更合适。

咱们一直均可以使用直接的卷积实现转置卷积。对于下图的例子,咱们在一个 2×2 的输入(周围加了 2×2 的单位步长的零填充)上应用一个 3×3 核的转置卷积。上采样输出的大小是 4×4。

将 2×2 的输入上采样成 4×4 的输出

有趣的是,经过应用各类填充和步长,咱们能够将一样的 2×2 输入图像映射到不一样的图像尺寸。下面,转置卷积被用在了同一张 2×2 输入上(输入之间插入了一个零,而且周围加了 2×2 的单位步长的零填充),所得输出的大小是 5×5。

将 2×2 的输入上采样成 5×5 的输出

观察上述例子中的转置卷积能帮助咱们构建起一些直观认识。但为了泛化其应用,了解其能够如何经过计算机的矩阵乘法实现是有益的。从这一点上咱们也能够看到为什么「转置卷积」才是合适的名称。

在卷积中,咱们定义 C 为卷积核,Large 为输入图像,Small 为输出图像。通过卷积(矩阵乘法)后,咱们将大图像下采样为小图像。这种矩阵乘法的卷积的实现遵守:C x Large = Small。

下面的例子展现了这种运算的工做方式。它将输入平展为 16×1 的矩阵,并将卷积核转换为一个稀疏矩阵(4×16)。而后,在稀疏矩阵和平展的输入之间使用矩阵乘法。以后,再将所获得的矩阵(4×1)转换为 2×2 的输出。

卷积的矩阵乘法:将 Large 输入图像(4×4)转换为 Small 输出图像(2×2)

如今,若是咱们在等式的两边都乘上矩阵的转置 CT,并借助「一个矩阵与其转置矩阵的乘法获得一个单位矩阵」这一性质,那么咱们就能获得公式 CT x Small = Large,以下图所示。

卷积的矩阵乘法:将 Small 输入图像(2×2)转换为 Large 输出图像(4×4)

这里能够看到,咱们执行了从小图像到大图像的上采样。这正是咱们想要实现的目标。如今。你就知道「转置卷积」这个名字的由来了。

转置矩阵的算术解释可参阅:https://arxiv.org/abs/1603.07285

4、扩张卷积(Atrous 卷积)

扩张卷积由这两篇引入:

https://arxiv.org/abs/1412.7062;https://arxiv.org/abs/1511.07122

这是一个标准的离散卷积:

扩张卷积以下:

当 l=1 时,扩张卷积会变得和标准卷积同样。

扩张卷积

直观而言,扩张卷积就是经过在核元素之间插入空格来使核「膨胀」。新增的参数 l(扩张率)表示咱们但愿将核加宽的程度。具体实现可能各不相同,但一般是在核元素之间插入 l-1 个空格。下面展现了 l = 1, 2, 4 时的核大小。

扩张卷积的感觉野。咱们基本上无需添加额外的成本就能有较大的感觉野。

在这张图像中,3×3 的红点表示通过卷积后,输出图像是 3×3 像素。尽管全部这三个扩张卷积的输出都是同一尺寸,但模型观察到的感觉野有很大的不一样。l=1 时感觉野为 3×3,l=2 时为 7×7。l=3 时,感觉野的大小就增长到了 15×15。有趣的是,与这些操做相关的参数的数量是相等的。咱们「观察」更大的感觉野不会有额外的成本。所以,扩张卷积可用于廉价地增大输出单元的感觉野,而不会增大其核大小,这在多个扩张卷积彼此堆叠时尤为有效。

论文《Multi-scale context aggregation by dilated convolutions》的做者用多个扩张卷积层构建了一个网络,其中扩张率 l 每层都按指数增大。由此,有效的感觉野大小随层而指数增加,而参数的数量仅线性增加。

这篇论文中扩张卷积的做用是系统性地聚合多个比例的形境信息,而不丢失分辨率。这篇论文代表其提出的模块可以提高那时候(2016 年)的当前最佳形义分割系统的准确度。请参阅那篇论文了解更多信息。

5、可分卷积

某些神经网络架构使用了可分卷积,好比 MobileNets。可分卷积有空间可分卷积和深度可分卷积。

一、空间可分卷积

空间可分卷积操做的是图像的 2D 空间维度,即高和宽。从概念上看,空间可分卷积是将一个卷积分解为两个单独的运算。对于下面的示例,3×3 的 Sobel 核被分红了一个 3×1 核和一个 1×3 核。

Sobel 核可分为一个 3x1 和一个 1x3 核

在卷积中,3×3 核直接与图像卷积。在空间可分卷积中,3×1 核首先与图像卷积,而后再应用 1×3 核。这样,执行一样的操做时仅需 6 个参数,而不是 9 个。

此外,使用空间可分卷积时所需的矩阵乘法也更少。给一个具体的例子,5×5 图像与 3×3 核的卷积(步幅=1,填充=0)要求在 3 个位置水平地扫描核(还有 3 个垂直的位置)。总共就是 9 个位置,表示为下图中的点。在每一个位置,会应用 9 次逐元素乘法。总共就是 9×9=81 次乘法。

具备 1 个通道的标准卷积

另外一方面,对于空间可分卷积,咱们首先在 5×5 的图像上应用一个 3×1 的过滤器。咱们能够在水平 5 个位置和垂直 3 个位置扫描这样的核。总共就是 5×3=15 个位置,表示为下图中的点。在每一个位置,会应用 3 次逐元素乘法。总共就是 15×3=45 次乘法。如今咱们获得了一个 3×5 的矩阵。这个矩阵再与一个 1×3 核卷积,即在水平 3 个位置和垂直 3 个位置扫描这个矩阵。对于这 9 个位置中的每个,应用 3 次逐元素乘法。这一步须要 9×3=27 次乘法。所以,整体而言,空间可分卷积须要 45+27=72 次乘法,少于普通卷积。

具备 1 个通道的空间可分卷积

咱们稍微推广一下上面的例子。假设咱们如今将卷积应用于一张 N×N 的图像上,卷积核为 m×m,步幅为 1,填充为 0。传统卷积须要 (N-2) x (N-2) x m x m 次乘法,空间可分卷积须要 N x (N-2) x m + (N-2) x (N-2) x m = (2N-2) x (N-2) x m 次乘法。空间可分卷积与标准卷积的计算成本比为:

由于图像尺寸 N 远大于过滤器大小(N>>m),因此这个比就变成了 2/m。也就是说,在这种渐进状况(N>>m)下,当过滤器大小为 3×3 时,空间可分卷积的计算成本是标准卷积的 2/3。过滤器大小为 5×5 时这一数值是 2/5;过滤器大小为 7×7 时则为 2/7。

尽管空间可分卷积能节省成本,但深度学习却不多使用它。一大主要缘由是并不是全部的核都能分红两个更小的核。若是咱们用空间可分卷积替代全部的传统卷积,那么咱们就限制了本身在训练过程当中搜索全部可能的核。这样获得的训练结果多是次优的。

二、深度可分卷积

如今来看深度可分卷积,这在深度学习领域要经常使用得多(好比 MobileNet 和 Xception)。深度可分卷积包含两个步骤:深度卷积核 1×1 卷积。

在描述这些步骤以前,有必要回顾一下咱们以前介绍的 2D 卷积核 1×1 卷积。首先快速回顾标准的 2D 卷积。举一个具体例子,假设输入层的大小是 7×7×3(高×宽×通道),而过滤器的大小是 3×3×3。通过与一个过滤器的 2D 卷积以后,输出层的大小是 5×5×1(仅有一个通道)。

用于建立仅有 1 层的输出的标准 2D 卷积,使用 1 个过滤器

通常来讲,两个神经网络层之间会应用多个过滤器。假设咱们这里有 128 个过滤器。在应用了这 128 个 2D 卷积以后,咱们有 128 个 5×5×1 的输出映射图(map)。而后咱们将这些映射图堆叠成大小为 5×5×128 的单层。经过这种操做,咱们可将输入层(7×7×3)转换成输出层(5×5×128)。空间维度(即高度和宽度)会变小,而深度会增大。

用于建立有 128 层的输出的标准 2D 卷积,要使用 128 个过滤器

如今使用深度可分卷积,看看咱们如何实现一样的变换。

首先,咱们将深度卷积应用于输入层。但咱们不使用 2D 卷积中大小为 3×3×3 的单个过滤器,而是分开使用 3 个核。每一个过滤器的大小为 3×3×1。每一个核与输入层的一个通道卷积(仅一个通道,而非全部通道!)。每一个这样的卷积都能提供大小为 5×5×1 的映射图。而后咱们将这些映射图堆叠在一块儿,建立一个 5×5×3 的图像。通过这个操做以后,咱们获得大小为 5×5×3 的输出。如今咱们能够下降空间维度了,但深度仍是和以前同样。

深度可分卷积——第一步:咱们不使用 2D 卷积中大小为 3×3×3 的单个过滤器,而是分开使用 3 个核。每一个过滤器的大小为 3×3×1。每一个核与输入层的一个通道卷积(仅一个通道,而非全部通道!)。每一个这样的卷积都能提供大小为 5×5×1 的映射图。而后咱们将这些映射图堆叠在一块儿,建立一个 5×5×3 的图像。通过这个操做以后,咱们获得大小为 5×5×3 的输出。

在深度可分卷积的第二步,为了扩展深度,咱们应用一个核大小为 1×1×3 的 1×1 卷积。将 5×5×3 的输入图像与每一个 1×1×3 的核卷积,可获得大小为 5×5×1 的映射图。

所以,在应用了 128 个 1×1 卷积以后,咱们获得大小为 5×5×128 的层。

深度可分卷积——第二步:应用多个 1×1 卷积来修改深度。

经过这两个步骤,深度可分卷积也会将输入层(7×7×3)变换到输出层(5×5×128)。

下图展现了深度可分卷积的整个过程。

深度可分卷积的整个过程

因此,深度可分卷积有何优点呢?效率!相比于 2D 卷积,深度可分卷积所需的操做要少得多。

回忆一下咱们的 2D 卷积例子的计算成本。有 128 个 3×3×3 个核移动了 5×5 次,也就是 128 x 3 x 3 x 3 x 5 x 5 = 86400 次乘法。

可分卷积又如何呢?在第一个深度卷积步骤,有 3 个 3×3×1 核移动 5×5 次,也就是 3x3x3x1x5x5 = 675 次乘法。在 1×1 卷积的第二步,有 128 个 1×1×3 核移动 5×5 次,即 128 x 1 x 1 x 3 x 5 x 5 = 9600 次乘法。所以,深度可分卷积共有 675 + 9600 = 10275 次乘法。这样的成本大概仅有 2D 卷积的 12%!

因此,对于任意尺寸的图像,若是咱们应用深度可分卷积,咱们能够节省多少时间?让咱们泛化以上例子。如今,对于大小为 H×W×D 的输入图像,若是使用 Nc 个大小为 h×h×D 的核执行 2D 卷积(步幅为 1,填充为 0,其中 h 是偶数)。为了将输入层(H×W×D)变换到输出层((H-h+1)x (W-h+1) x Nc),所需的总乘法次数为:

Nc x h x h x D x (H-h+1) x (W-h+1)

另外一方面,对于一样的变换,深度可分卷积所需的乘法次数为:

D x h x h x 1 x (H-h+1) x (W-h+1) + Nc x 1 x 1 x D x (H-h+1) x (W-h+1) = (h x h + Nc) x D x (H-h+1) x (W-h+1)

则深度可分卷积与 2D 卷积所需的乘法次数比为:

现代大多数架构的输出层一般都有不少通道,可达数百甚至上千。对于这样的层(Nc >> h),则上式可约简为 1 / h。基于此,若是使用 3×3 过滤器,则 2D 卷积所需的乘法次数是深度可分卷积的 9 倍。若是使用 5×5 过滤器,则 2D 卷积所需的乘法次数是深度可分卷积的 25 倍。

使用深度可分卷积有什么坏处吗?固然是有的。深度可分卷积会下降卷积中参数的数量。所以,对于较小的模型而言,若是用深度可分卷积替代 2D 卷积,模型的能力可能会显著降低。所以,获得的模型多是次优的。可是,若是使用得当,深度可分卷积能在不下降你的模型性能的前提下帮助你实现效率提高。

6、分组卷积

AlexNet 论文(https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)在 2012 年引入了分组卷积。实现分组卷积的主要缘由是让网络训练可在 2 个内存有限(每一个 GPU 有 1.5 GB 内存)的 GPU 上进行。下面的 AlexNet 代表在大多数层中都有两个分开的卷积路径。这是在两个 GPU 上执行模型并行化(固然若是可使用更多 GPU,还能执行多 GPU 并行化)。

图片来自 AlexNet 论文

这里咱们介绍一下分组卷积的工做方式。首先,典型的 2D 卷积的步骤以下图所示。在这个例子中,经过应用 128 个大小为 3×3×3 的过滤器将输入层(7×7×3)变换到输出层(5×5×128)。推广而言,即经过应用 Dout 个大小为 h x w x Din 的核将输入层(Hin x Win x Din)变换到输出层(Hout x Wout x Dout)。

标准的 2D 卷积

在分组卷积中,过滤器会被分为不一样的组。每一组都负责特定深度的典型 2D 卷积。下面的例子能让你更清楚地理解。

具备两个过滤器分组的分组卷积

上图展现了具备两个过滤器分组的分组卷积。在每一个过滤器分组中,每一个过滤器的深度仅有名义上的 2D 卷积的一半。它们的深度是 Din/2。每一个过滤器分组包含 Dout/2 个过滤器。第一个过滤器分组(红色)与输入层的前一半([:, :, 0:Din/2])卷积,而第二个过滤器分组(橙色)与输入层的后一半([:, :, Din/2:Din])卷积。所以,每一个过滤器分组都会建立 Dout/2 个通道。总体而言,两个分组会建立 2×Dout/2 = Dout 个通道。而后咱们将这些通道堆叠在一块儿,获得有 Dout 个通道的输出层。

一、分组卷积与深度卷积

你可能会注意到分组卷积与深度可分卷积中使用的深度卷积之间存在一些联系和差别。若是过滤器分组的数量与输入层通道的数量相同,则每一个过滤器的深度都为 Din/Din=1。这样的过滤器深度就与深度卷积中的同样了。

另外一方面,如今每一个过滤器分组都包含 Dout/Din 个过滤器。总体而言,输出层的深度为 Dout。这不一样于深度卷积的状况——深度卷积并不会改变层的深度。在深度可分卷积中,层的深度以后经过 1×1 卷积进行扩展。

分组卷积有几个优势。

第一个优势是高效训练。由于卷积被分红了多个路径,每一个路径均可由不一样的 GPU 分开处理,因此模型能够并行方式在多个 GPU 上进行训练。相比于在单个 GPU 上完成全部任务,这样的在多个 GPU 上的模型并行化能让网络在每一个步骤处理更多图像。人们通常认为模型并行化比数据并行化更好。后者是将数据集分红多个批次,而后分开训练每一批。可是,当批量大小变得太小时,咱们本质上是执行随机梯度降低,而非批梯度降低。这会形成更慢,有时候更差的收敛结果。

在训练很是深的神经网络时,分组卷积会很是重要,正如在 ResNeXt 中那样。

图片来自 ResNeXt 论文,https://arxiv.org/abs/1611.05431

第二个优势是模型会更高效,即模型参数会随过滤器分组数的增大而减小。在以前的例子中,完整的标准 2D 卷积有 h x w x Din x Dout 个参数。具备 2 个过滤器分组的分组卷积有 (h x w x Din/2 x Dout/2) x 2 个参数。参数数量减小了一半。

第三个优势有些让人惊讶。分组卷积也许能提供比标准完整 2D 卷积更好的模型。另外一篇出色的博客已经解释了这一点:https://blog.yani.io/filter-group-tutorial。这里简要总结一下。

缘由和稀疏过滤器的关系有关。下图是相邻层过滤器的相关性。其中的关系是稀疏的。

在 CIFAR10 上训练的一个 Network-in-Network 模型中相邻层的过滤器的相关性矩阵。高度相关的过滤器对更明亮,而相关性更低的过滤器则更暗。图片来自:https://blog.yani.io/filter-group-tutorial

分组矩阵的相关性映射图又如何?

在 CIFAR10 上训练的一个 Network-in-Network 模型中相邻层的过滤器的相关性,动图分别展现了有 一、二、四、八、16 个过滤器分组的状况。图片来自 https://blog.yani.io/filter-group-tutorial

上图是当用 一、二、四、八、16 个过滤器分组训练模型时,相邻层的过滤器之间的相关性。那篇文章提出了一个推理:「过滤器分组的效果是在通道维度上学习块对角结构的稀疏性……在网络中,具备高相关性的过滤器是使用过滤器分组以一种更为结构化的方式学习到。从效果上看,没必要学习的过滤器关系就再也不参数化。这样显著地减小网络中的参数数量能使其不容易过拟合,所以,一种相似正则化的效果让优化器能够学习获得更准确更高效的深度网络。」

AlexNet conv1 过滤器分解:正如做者指出的那样,过滤器分组彷佛会将学习到的过滤器结构性地组织成两个不一样的分组。本图来自 AlexNet 论文。

此外,每一个过滤器分组都会学习数据的一个独特表征。正如 AlexNet 的做者指出的那样,过滤器分组彷佛会将学习到的过滤器结构性地组织成两个不一样的分组——黑白过滤器和彩色过滤器。

你认为深度学习领域的卷积还有那些值得注意的地方?

原文连接:https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215