本文总结了深度学习中常用的八大类型的卷积,以非常形象的方式帮助你建立直觉理解,为你的深度学习提供有益的参考。
分别是单通道卷积、多通道卷积、3D卷积、1 x 1卷积、转置卷积、扩张卷积、可分离卷积、分组卷积。
单通道卷积
单通道卷积
在深度学习中,卷积是元素先乘法后加法。对于具有1个通道的图像,卷积如下图所示。这里的滤波器是一个3 x 3矩阵,元素为[[0,1,2],[2,2,0],[0,1,2]]。过滤器在输入端滑动。在每个位置,它都在进行元素乘法和加法。每个滑动位置最终都有一个数字。最终输出是3 x 3矩阵。
多通道卷积
在许多应用程序中,我们处理的是具有多个通道的图像。典型的例子是RGB图像。每个RGB通道都强调原始图像的不同方面,如下图所示:
图像拍摄于云南省元阳市
卷积神经网络中每层用多个滤波器核就是多通道。卷积网络层通常由多个通道(数百个卷积核)组成。每个通道提取前一层不同方面的抽象特征。我们如何在不同深度的层之间进行过渡?我们如何将深度为n的图层转换为深度为m的后续图层?
"层"(过滤器)和"通道"(卷积核)
多通道卷积如下。将每个内核应用到前一层的输入通道上以生成一个输出通道。这是一个内核方面的过程。我们为所有内核重复这样的过程以生成多个通道。然后将这些通道中的每一个加在一起以形成单个输出通道。
下图使多通道卷积过程更清晰。
输入层是一个5 x 5 x 3矩阵,有3个通道。滤波器是3 x 3 x 3矩阵。首先,过滤器中的每个内核分别应用于输入层中的三个通道,并相加;然后,执行三次卷积,产生3个尺寸为3×3的通道。
多通道2D卷积的***步:滤波器中的每个内核分别应用于输入层中的三个通道。
多通道的2D卷积的第二步:然后将这三个通道相加在一起(逐元素加法)以形成一个单通道。
3D卷积
3D滤镜可以在所有3个方向(图像的高度,宽度,通道)上移动。在每个位置,逐元素乘法和加法提供一个数字。由于滤镜滑过3D空间,因此输出数字也排列在3D空间中,然后输出是3D数据。
类似于2D卷积中对象的空间关系,3D卷积可以描述3D空间中的对象的空间关系。这种3D关系有很重要的应用,例如在生物医学想象的3D分割/重建中,CT和MRI,其中诸如血管的对象在3D空间中蜿蜒。
1 x 1卷积
1 x 1卷积中将一个数字乘以输入层中的每个数字。
如果输入层有多个通道,此卷积会产生有趣的作用。下图说明了1 x 1卷积如何适用于尺寸为H x W x D的输入层。在滤波器尺寸为1 x 1 x D的1 x 1卷积之后,输出通道的尺寸为H x W x 1.如果我们应用N这样的1 x 1卷积然后将结果连接在一起,我们可以得到一个尺寸为H x W x N的输出层。
1 x 1卷积,滤波器大小为1 x 1 x D
最初,在网络网络文件中提出了1 x 1卷积。然后,他们在Google Inception 被高度使用1 x 1卷积的一些优点是:
- 降低维度以实现高效计算
- 高效的低维嵌入或特征池
- 卷积后再次应用非线性
在上图中可以观察到前两个优点。在1 x 1卷积之后,我们显着地减小了尺寸。假设原始输入有200个通道,1 x 1卷积会将这些通道(功能)嵌入到单个通道中。第三个优点是在1 x 1卷积之后,可以添加诸如ReLU的非线性激活,非线性允许网络学习更复杂的功能。
转置卷积(解卷积、反卷积)
对于许多应用程序和许多网络架构,我们经常希望进行与正常卷积相反方向的转换,即我们希望执行上采样。一些示例包括生成高分辨率图像并将低维特征映射映射到高维空间,例如自动编码器或语义分段。
传统上,可以通过应用插值方案或手动创建规则来实现上采样。然而,神经网络之类的现代架构可以让网络本身自动地学习正确的转换,而无需人为干预。
对于下图中的示例,我们使用3 x 3内核在2 x 2输入上应用转置卷积,使用单位步幅填充2 x 2边框,上采样输出的大小为4 x 4。
输入2 x 2上采样输出4 x 4
有趣的是,通过应用花式填充和步幅,可以将相同的2 x 2输入图像映射到不同的图像大小。下面,转置卷积应用于相同的2 x 2输入,使用单位步幅填充2 x 2边界的零,现在输出的大小为5 x 5。
输入2 x 2上采样输出5 x 5
在卷积中,让我们将C定义为我们的内核,将Large定义为输入图像,将Small定义为来自卷积的输出图像。在卷积(矩阵乘法)之后,我们将大图像下采样为小图像输出。矩阵乘法中的卷积的实现遵循C x Large = Small。
以下示例显示了此类操作的工作原理。它将输入展平为16 x 1矩阵,并将内核转换为稀疏矩阵(4 x 16)。然后在稀疏矩阵和平坦输入之间应用矩阵乘法。之后,将得到的矩阵(4×1)转换回2×2输出。
卷积的矩阵乘法:从大输入图像(4 x 4)到小输出图像(2 x 2)
现在,如果我们在方程的两边多重矩阵CT的转置,并使用矩阵与其转置矩阵的乘法给出单位矩阵的属性,那么我们有以下公式CT x Small = Large,如下所示下图。
卷积的矩阵乘法:从小输入图像(2 x 2)到大输出图像(4 x 4)
扩张卷积
标准的离散卷积:
标准卷积
扩张的卷积如下:
当l = 1时,扩张卷积变为标准卷积。
扩张卷积
直观地说,扩张的卷积通过在内核元素之间插入空格来"膨胀"内核。这个附加参数l(扩张率)表示我们想要扩展内核的程度。实现可能会有所不同,但内核元素之间通常会插入l-1个空格。下图显示了l = 1,2和4时的内核大小。
扩张卷积的感受野
观察一个大的感受野,而不增加额外的成本。
在图像中,3×3个红点表示在卷积之后,输出图像具有3×3像素。虽然所有三个扩张的卷积都为输出提供了相同的尺寸,但模型观察到的感受野是截然不同的。对于l = 1,接收域为3 x 3 ,l = 2时为7 x 7 ,对于l = 3,接收领域增加到15 x 15 。有趣的是,与这些操作相关的参数数量基本相同。
可分离卷积
空间可分卷积
空间可分离卷积在图像的2D空间维度上操作,即高度和宽度。从概念上讲,空间可分离卷积将卷积分解为两个单独的操作。对于下面显示的示例,内核(3x3内核)被划分为3x1和1x3内核。
在卷积中,3x3内核直接与图像卷积。在空间可分离的卷积中,3x1内核首先与图像卷积。然后应用1x3内核。在执行相同操作时,这将需要6个而不是9个参数。
此外,在空间上可分离的卷积中需要比卷积更少的矩阵乘法。对于一个具体的例子,在具有3×3内核(stride = 1,padding = 0)的5×5图像上的卷积需要在水平3个位置和垂直3个位置扫描内核,共9个位置,如下图所示。在每个位置,应用9个元素乘法。总共9 x 9 = 81次乘法。
标准卷积
另一方面,对于空间可分离卷积,我们首先在5 x 5图像上应用3 x 1滤波器。我们在水平5个位置和垂直3个位置扫描这样的内核。共5×3 = 15个位置,表示为下面的图像上的点。在每个位置,应用3个元素乘法。那是15 x 3 = 45次乘法。我们现在获得了3 x 5矩阵。此矩阵现在与1 x 3内核进行卷积,内核在水平3个位置和垂直3个位置扫描矩阵。对于这9个位置中的每一个,应用3个元素乘法。此步骤需要9 x 3 = 27次乘法。因此,总体而言,空间可分离的卷积需要45 + 27 = 72乘法,小于标准卷积。
深度可分卷积
深度可分离的旋转包括两个步骤:深度卷积和1x1卷积。
在描述这些步骤之前,值得重新审视我之前部分中讨论的2D卷积和1 x 1卷积。让我们快速回顾一下标准2D卷积。举一个具体的例子,假设输入层的大小为7 x 7 x 3(高x宽x通道),滤波器的大小为3 x 3 x 3。使用一个滤波器进行2D卷积后,输出层为尺寸为5 x 5 x 1(仅有1个通道)。
标准2D卷积,使用1个滤波器创建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)。空间尺寸,即高度和宽度,缩小,而深度延长。
标准2D卷积,使用128个滤波器创建128层输出
现在有了深度可分离的卷积,让我们看看我们如何实现相同的转换。
首先,我们将深度卷积应用于输入层。我们不是在2D卷积中使用尺寸为3 x 3 x 3的单个滤波器,而是分别使用3个内核。每个滤波器的大小为3 x 3 x 1.每个内核与输入层的1个通道进行卷积(仅1个通道,而不是所有通道!)。每个这样的卷积提供尺寸为5×5×1的图。然后我们将这些图堆叠在一起以创建5×5×3图像。在此之后,我们的输出尺寸为5 x 5 x 3.我们现在缩小空间尺寸,但深度仍然与以前相同。
深度可分卷积 - ***步:我们分别使用3个内核,而不是在2D卷积中使用大小为3 x 3 x 3的单个滤波器。每个滤波器的大小为3 x 3 x 1。每个内核与输入层的1个通道进行卷积(仅1个通道,而不是所有通道)。每个这样的卷积提供尺寸为5×5×1的图。然后我们将这些图堆叠在一起以创建5×5×3图像。在此之后,我们的输出尺寸为5 x 5 x 3。
作为深度可分离卷积的第二步,为了扩展深度,我们应用1x1卷积,内核大小为1x1x3。将5 x 5 x 3输入图像与每个1 x 1 x 3内核进行对比,可提供大小为5 x 5 x 1的映射。
因此,在应用128个1x1卷积后,我们可以得到一个尺寸为5 x 5 x 128的层。
深度可分卷积 - 第二步:应用多个1 x 1卷积来修改深度。
通过这两个步骤,深度可分离卷积还将输入层(7 x 7 x 3)转换为输出层(5 x 5 x 128)。
深度可分离卷积的整个过程如下图所示。
深度可分卷积的整个过程
那么,深度可分离卷积的优势是什么?效率!与2D卷积相比,对于深度可分离卷积,需要更少的操作。
让我们回顾一下2D卷积示例的计算成本。有128个3x3x3内核移动5x5次。这是128 x 3 x 3 x 3 x 5 x 5 = 86,400次乘法。
可分离的卷积怎么样?在***个深度卷积步骤中,有3个3x3x1内核移动5x5次。那是3x3x3x1x5x5 = 675次乘法。在1 x 1卷积的第二步中,有128个1x1x3内核移动5x5次。这是128 x 1 x 1 x 3 x 5 x 5 = 9,600次乘法。因此,总体而言,深度可分离卷积需要675 + 9600 = 10,275次乘法。这只是2D卷积成本的12%左右!
分组卷积
2012年,在AlexNet论文中引入了分组卷积。实现它的主要原因是允许通过两个具有有限内存(每个GPU 1.5 GB内存)的GPU进行网络训练。下面的AlexNet在大多数层上显示了两个独立的卷积路径。它正在跨两个GPU进行模型并行化(当然,如果有更多的GPU,可以进行多GPU并行化)。
在这里,我们描述分组卷积如何工作。首先,传统的2D卷积遵循以下步骤。在此示例中,通过应用128个滤波器(每个滤波器的大小为3 x 3 x 3),将大小为(7 x 7 x 3)的输入层转换为大小为(5 x 5 x 128)的输出层。或者在一般情况下,通过应用Dout内核(每个大小为h x w x Din)将大小(Hin x Win x Din)的输入层变换为大小(Hout x Wout x Dout)的输出层。
标准2D卷积
在分组卷积中,过滤器被分成不同的组。每组负责具有一定深度的传统2D卷积。如下图。
具有2个滤波器组的分组卷积
以上是具有2个滤波器组的分组卷积的说明。在每个滤波器组中,每个滤波器的深度仅为标称2D卷积的深度的一半。它们具有深度Din/2。每个滤波器组包含Dout/2滤波器。***个滤波器组(红色)与输入层的前半部分([:,:0:Din/2])卷积,而第二个滤波器组(蓝色)与输入层的后半部分卷积([:,:,Din/2:Din])。因此,每个过滤器组都会创建Dout / 2通道。总的来说,两组创建2 x Dout/2 = Dout频道。然后,我们使用Dout通道将这些通道堆叠在输出层中。