注意:本文引用自专业人工智能社区Venus AI
更多AI知识请参考原站 ([www.aideeplearning.cn])
引言
卷积神经网络(CNN)的核心在于其多样化的卷积技术,每种技术针对不同的应用和性能需求有着独特的优势。逐通道卷积和逐点卷积关注单独通道的特征提取和通道间信息的融合。深度可分离卷积结合了这两者,提高了效率。组卷积通过分组处理输入通道来减少参数量,而空间可分离卷积则在不同空间维度独立应用卷积核。空洞卷积通过增加卷积核中的空间间隔来捕捉更宽广的上下文信息。转置卷积常用于图像生成任务,稀疏卷积则关注在大量零值存在时的高效计算。最后,多维卷积扩展了卷积操作到更高维度的数据。这些技术共同支持了CNN在图像处理、视频分析和其他多维数据处理任务中的广泛应用。下面我们将依次详细的介绍这卷积的九大变体。
1. 逐通道卷积
逐通道卷积(Depthwise Convolution)又称逐层卷积。首先通过一个例子来对比讲解一下逐层卷积与常规卷积的关系。回忆一下常规的卷积操作,在卷积操作中对于 5x5x3 的输入信息,如果想要得到 3x3x4 的特征图输出,那么卷积核的形状为 3x3x3x4 ,如图1所示。
卷积层共有 4 个卷积核, 每个卷积核包含一个通道数为 3 (与输入信息通道相同), 且尺寸为 3×3 的卷积核。因此卷积层的参数数量可以用公式: 卷积层的参数量 = 卷积核宽度 × 卷积核高度 × 输入通道数 × 输出通道数来计算, 即:
卷积层的计算量公式为: 卷积层的计算量 = 卷积核宽度 × 卷积核高度 × (输入信息宽度 -卷积核宽度 +1)×( 输入信息高度 – 卷积核高度 +1)× 输入通道数 × 输出通道数, 即:
逐通道卷积的一个卷积核只有一个通道, 输入信息的一个通道只被一个卷积核卷积, 这个卷积过程产生的特征图通道数和输入的通道数相等, 如图2所示。
一张5×5像素的三通道彩色输入图片(形状为5x5x3),逐通道卷积每个卷积核只负责计算输入信息的某一个通道。卷积核的数量与输入信息的通道数相同。所以一个三通道的图像经过卷积运算后一定是生成了 3 个特征图。卷积核的形状一定为: 卷积核 W× 卷积核 H× 输入数据的通道数 C 。
此时, 卷积部分的参数个数计算为:
卷积操作的计算量为:
这个计算量相较于常规卷积操作在参数量和计算复杂度上是有非常大的下降的,因此被广泛运用在一些移动端设备上。但是,逐通道卷积输出的特征图的数量与输入层的通道数相同,无法在通道维度上扩展或压缩特征图的数量。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效利用不同通道在相同空间位置上的特征相关性。简而言之,虽然减少了计算量,但是失去了通道维度上的信息交互。因此需要逐点卷积来将这些特征图进行组合,在通道维度上实现信息交互。
下面通过动图的形式,展示了逐通道卷积的计算过程,动图中共使用了8个卷积核 ,请点击观看:
2. 逐点卷积
逐点卷积(Pointwise Convolution)的运算与常规卷积运算非常相似,其实就是卷积核大小为1×1的普通卷积。它的卷积核的形状为1x1xM,M为上一层输出信息的通道数。逐点卷积的每个卷积核会将上一步的特征图在通道方向上进行加权组合,计算生成新的特征图。每个卷积核都可以生成一个输出特征图,而卷积核的个数就是输出特征图的数量,逐点卷积如图3所示。
此时, 逐点卷积中卷积涉及的参数个数可以计算为:
卷积操作的计算量则为:
经过逐点卷积之后, 四个卷积核输出了 4 张特征图, 与常规卷积的输出维度相同。逐点卷积是一种卷积神经网络中常用的操作, 其主要的两个好处如下:
(1)参数量较小:相比于传统的卷积操作,逐点卷积的卷积核大小为1×1,因此需要学习的参数数量较少,可以在保证较高准确率的同时减少模型的大小,提高模型的训练和推理效率。
(2)可以在不改变特征图大小的情况下进行通道数的变换:逐点卷积在每个位置独立地对输入的每个通道进行卷积操作,因此可以通过设置卷积核的数量将输入的通道数转换为任意数量的输出通道数,这种操作在CNN中非常常见,被广泛用于实现网络的深度和宽度缩放。此外,由于逐点卷积可以保留原始特征图的空间维度大小,因此可以在保持空间分辨率不变的情况下对特征图的通道数进行变换,从而更好地提取特征。
最后,值得注意的是逐点卷积和全连接层在某些情况下是等价的,这主要是因为它们的计算方式相似。
逐点卷积中, 卷积核大小为 1×1, 通常用于调整通道数。假设输入张量大小为 ,输出张量大小为 , 则逐点卷积的权重矩阵大小为 , 其中 是输入张量的通道数, 是输出张量的通道数。逐点卷积的计算可以表示为:
其中, 表示输入张量在位置 (i,j) 处的第 c 个通道的值, 表示逐点卷积的第 c 个通道和第 k 个通道之间的权重, 表示输出张量在位置 (i,j) 处的第 k 个通道的值。
全连接层的作用是将输入张量中的每个像素点与权重矩阵中的每个元素相乘, 并将结果相加得到输出。如果将全连接层的输入张量表示为一维向量 x, 权重矩阵表示为二维矩阵 W,则全连接层的计算可以表示为:
其中, y 表示输出向量, x 表示输入向量, W 表示权重矩阵。
从上述两个计算公式可以看出, 逐点卷积和全连接层的计算方式非常相似。实际上, 当逐点卷积的卷积核大小为 1×1 时, 它就等价于全连接层, 因为它们都是对输入信息的全部元素逐一的进行权重相乘的计算, 然后再求和得到输出。此时, 逐点卷积的权重矩阵可以看作是全连接层的权重矩阵, 逐点卷积的计算可以看作是全连接层的计算。
因此, 当逐点卷积的卷积核大小为 1×1 时, 它可以被视为全连接层的一种特殊形式, 这也解释了为什么逐点卷积和全连接层在某些情况下是等价的。
3. 深度可分离卷积
深度可分离卷积(Depthwise Separable Convolution)的概念很简单,它是逐通道卷积和逐点卷积配合使用得来的。它在降低模型计算复杂度的同时,还能提升卷积的准确度,是更有效的卷积方式。继续使用刚才的例子,来对比一下常规卷积和深度可分离卷积的参数量和计算量。
常规卷积的参数个数由公式计算为108,而深度可分离卷积的参数个数由逐通道卷积参数和逐点卷积参数两部分相加得到:
相同的输入, 同样是得到 4 张特征图的输出, 深度可分离卷积的参数个数是常规卷积的约 1/3 。因此, 在参数量相同的前提下, 采用深度可分离卷积的神经网络层数可以做得更深。
在计算量对比方面也是类似的情况, 常规卷积的计算量由公式得出为 972, 而深度可分离卷积的计算量由逐通道卷积的计算量和逐点卷积的计算量两部分相加得到:
相同的输入,同样是得到 4 张特征图的输出,深度可分离卷积的计算量也是常规卷积的约 1/3 。因此, 在计算量相同的情况下, 通过使用深度可分离卷积, 可以加深神经网络的层数。
除了计算更高效,深度可分离卷积可以看作对常规卷积计算特征的过程进行了分布的规划。在常规的卷积中,卷积核是四维的(数量通道,特征通道,高度通道,宽度通道),其中特征通道代表特征维度,高度通道和宽度通道代表空间维度,因此常规卷积可以同时在特征维度和空间维度对输入数据进行处理。而逐层卷积核的维度是(数量通道,1,高度通道,宽度通道),只能对空间信息做处理;逐点卷积核的维度是(数量通道,特征通道,1,1),只能对特征信息做处理。因此深度可分离卷积对特征信息和空间信息的处理是解耦的。
下面通过动图的形式,展示了深度可分离卷积的计算过程,动图中共使用了8个卷积核 ,请点击观看:
4. 组卷积
当探讨卷积神经网络中的卷积操作时,理解普通卷积(Standard Convolution)和组卷积(Group Convolution)之间的区别非常重要。这两种卷积方式可以根据组数的不同展示出不同的特性。
在普通卷积中,卷积核作用于输入特征图的所有通道。以一个具有8个通道的输入特征图和8个卷积核为例,在普通卷积中,每个卷积核都会作用于所有8个通道,最终生成一个新的输出通道。这种方式意味着卷积核能够捕获输入特征图所有通道间的信息。如下动图所示(点击观看):
组卷积是一种将输入特征图分组并在每个组内独立进行卷积运算的技术。例如,仍然考虑有8个通道的输入特征图,但现在卷积核变成了4个。当组卷积的组数为2时,将输入信息分成2组,每组含有4个通道。在这种情况下,四个卷积核也对应的被分成了两组,分别与对应组的输入信息进行卷积操作。如下动图所示(点击观看):
组卷积的两个极端
- 组数为1的组卷积(普通卷积):这是最基本的卷积形式,其中所有的输入通道都被用于每个卷积核。这种情况下,网络能够捕获所有输入通道间的复杂交互,但参数数量和计算成本也是最高的。
- 组数与输入数据通道数相等的组卷积(Depthwise Convolution 或逐层卷积):在这个极端情况下,每个通道被视为一个单独的组,每个卷积核仅作用于一个通道。这种方式大大减少了参数数量和计算复杂度,但可能会牺牲一些表示能力,因为它不再能捕捉不同通道间的交互。
总的来说,组卷积提供了一种在参数效率和表示能力之间权衡的方式。它可以根据所需的计算资源和网络性能调整组的数量,从而在保持模型效率的同时最大化性能。普通卷积和逐层卷积分别代表了这一权衡的两个极端。但组卷积也存在缺点,一个显而易见的问题是在卷积过程中只有该组内的特征图进行融合,而不同组别之间缺乏计算。长此以往,不同组内的特征图对于其他组的特征了解就越来越少,虽然网络顶层的全连接层会帮助不同特征图相互连接,但是这样的连接融合的次数较少,不如常规卷积的情况。
基于上述情况,ShuffleNet模型中提出了一个名为通道打散(Channel Shuffle)的解决方案。把组卷积每个组计算得到的特征图进行一定程度的乱序排列后,再送入下一层组卷积,以这样的方式增加特征图的在不同组间的信息交互。详见博文【link】。
5. 空间可分离卷积
空间可分离卷积(Spatially Separable Convolution)是一种用于卷积神经网络的卷积操作,其原理是将原来的二维卷积操作拆分成两个一维卷积操作,从而减少计算量和参数数量。
具体来说,空间可分离卷积先将输入特征图在横向和纵向分别进行一维卷积操作,然后再将两个卷积操作的结果按照原来的维度组合起来,得到最终的输出特征图。这个过程可以用下面的公式表示:
其中, x 是输入特征图, y 是输出特征图, w 是卷积核, M 和 N 是卷积核的大小。公式(3-14)中的卷积操作可以拆分成下面两个一维卷积操作:
这样就可以将原来的二维卷积操作拆分成两个一维卷积操作, 从而大大减少了计算量和参数数量。具体来说, 如果原来的卷积核大小为 M×N, 那么拆分成两个一维卷积操作后,参数数量从 M×N 减少到 M+N, 计算量也大大降低。
空间可分离卷积的好处在于可以提高卷积神经网络的计算效率和模型效果。由于空间可分离卷积的参数数量和计算量都比传统的二维卷积要少,因此可以大大缩短训练时间和推理时间。此外,由于使用空间可分离卷积可以提高计算效率,因此可以添加更多的层或者使用更大的卷积核,间接地增大了感受野,增强了模型对图像特征的提取能力。
下面对比分析一下深度可分离卷积和空间可分离卷积的区别和联系。
两者的区别主要有两个:
(1)卷积核大小不同:空间可分离卷积和普通卷积核大小相同,一般是一个二维卷积核;而深度可分离卷积则是由两个不同大小的卷积核组成,其中一个是1×1的卷积核(逐点卷积),另一个是较小的二维卷积核(逐通道卷积)。
(2)计算方式不同:空间可分离卷积先进行一次横向卷积,再进行一次纵向卷积;而深度可分离卷积则先对每个通道做深度卷积,然后在输出通道上进行1×1卷积。
两者的联系也可以从两方面讲:
(1)都是卷积操作:空间可分离卷积和深度可分离卷积都是卷积操作,都是对输入特征图进行局部感知并输出相应的特征图。
(2)都是为了减少参数:空间可分离卷积和深度可分离卷积都是为了减少模型参数,提高模型效率。
总的来说,空间可分离卷积和深度可分离卷积在某些方面有区别,但也有很多相似之处,它们都是卷积神经网络中的重要卷积操作,可以用来构建高效的深度神经网络。相比较下,深度可分离卷积在一些应用中效果更好,也更加常见一些。
6. 空洞卷积
膨胀卷积(Dilated Convolution)也称作空洞卷积(Atrous Convolution),是一种在卷积神经网络中常用的操作。膨胀卷积是在标准卷积基础上增加了膨胀因子的概念,通过在卷积核中引入间隔性的空洞,使得卷积核感受野变大,从而在保持特征图尺寸不变的情况下增加了卷积核的有效感受野,扩大了网络的感受野,同时也能有效减少参数量。
膨胀卷积的原理如下:在标准卷积的基础上,膨胀卷积引入了一个膨胀系数 d,也称为膨胀因子,它表示在卷积过程中,卷积核中的元素之间相隔 d-1 个像素。具体来说,对于一个 k x k 的卷积核,如果其膨胀系数为 d,那么在卷积计算时,每次跳过 d-1 个像素进行卷积。膨胀卷积的计算方式与标准卷积类似,不同之处在于,卷积核的每个元素在计算时,需要与输入的特征图上距离自己为 d 的像素进行相乘求和,而不是与相邻的像素相乘求和。因此,膨胀卷积可以在保持特征图尺寸不变的情况下,增大卷积核的感受野,提高了网络的感受野和感知能力。
上图(a)为常规的卷积操作,上图(b)是膨胀系数 d=2 的膨胀卷积。同时使用 3×3 大小的卷积核,膨胀卷积可以获得更大的感受野。实际上,常规的卷积操作也可以看作膨胀卷积的特殊形式,即膨胀系数 d=1 的膨胀卷积。
膨胀卷积的好处主要有以下几点:
(1)增大感受野:由于膨胀卷积中卷积核的感受野变大,所以可以更好地捕捉到输入特征图中的长程信息,提高模型对图像整体特征的感知能力。
(2)减少参数量:在保持特征图尺寸不变的情况下,膨胀卷积增加了卷积核的有效感受野,从而减少了卷积核的参数数量,降低了模型的计算复杂度和内存消耗。
(3)节约计算资源:膨胀卷积可以通过增加膨胀系数来增大感受野,而不需要增加卷积核的大小和数量,从而节约了计算资源,使得卷积神经网络能够处理大尺寸图像。
7. 转置卷积
转置卷积(Transpose Convolution)也称为反卷积或上采样操作。在卷积操作中,通过滑动卷积核在输入图像上进行卷积操作来提取特征,这个过程一般是对输入数据进行下采样。而在转置卷积中,则是通过滑动反卷积核(也称为转置卷积核)在输入的特征图上进行操作,以实现图像的上采样,其计算过程如图5所示。
假设输入信息(input)和转置卷积核(kernel)都是一个 2×2 大小的矩阵,那么在计算过程中,input中的第一个元素“0”会依次与kernel中的权重进行相乘,相乘的结果如图5(a)所示方式进行存储;下一步,滑动转置卷积核到input中的第二个元素“1”位置,依次与kernel中的权重进行相乘,计算结果因为滑动的原因如图5(b)所示方式进行存储。以此类推直到遍历完input中所有的元素。最后,把这四次相乘的中间结果图5(a) (b) (c) (d)在对应位置进行求和操作,便得到了最后的输出结果。其本质上与常规卷积方式相同,都是一个局部的相乘求和操作。只不过,相乘求和的顺序和方法与常规卷积存在差异。这个差异导致了转置卷积在输出特征图的尺寸上往往是要大于输入信息的,用于一些信息重建的场景;而常规卷积的输出特征图尺寸往往小于输入信息,目的是对输入信息进行特征提取。
转置卷积作为卷积神经网络中的一种操作,具有广泛的应用场景。在图像分割和目标检测领域,转置卷积可以对特征图进行上采样,使其与输入图像具有相同的大小,分别实现像素级别的分割和进行物体的定位识别;在图像重建领域,转置卷积可以将低分辨率的图像上采样到高分辨率,以便实现图像的重建和增强;在图像生成领域,转置卷积可以将随机噪声向量转换为图像,从而实现图像生成和合成。
转置卷积的优点包括:
(1)上采样效果好:转置卷积可以将特征图上采样到输入图像的大小,从而实现像素级别的分割和对象检测等任务。
(2)网络可逆性:转置卷积具有网络可逆性,可以反向传播误差,从而实现端到端的训练和优化。
(3)可学习参数多:转置卷积具有大量的可学习参数,可以从数据中学习到有效的特征表示,从而提高模型的泛化能力。
但是,转置卷积也存在一些缺点:
(1)参数量大:转置卷积具有大量的可学习参数,容易导致模型过拟合和计算资源消耗过大。这其实与第3条优点之间是一种权衡问题。
(2)容易引起伪影:转置卷积的上采样效果好,但容易引起伪影和锯齿等问题,需要进行适当的处理和优化。
(3)计算量大:转置卷积需要进行矩阵乘法等复杂计算,计算量较大,需要采用一些高效的计算方法和技巧。
综上所述,转置卷积具有广泛的应用场景和优点,但也存在一些缺点和挑战。在实际应用中,需要根据具体的任务和需求,选择合适的转置卷积算法和优化方法,以提高模型的性能和效率。
8. 稀疏卷积
稀疏卷积(Sparse Convolution)是一种在卷积神经网络中用于处理稀疏输入的卷积操作。相对于传统的卷积操作,稀疏卷积可以显著地减少计算量和存储需求,从而提高模型的计算效率和泛化能力。
稀疏卷积的核心思想是通过利用输入数据的稀疏性,减少卷积操作中需要计算的位置和权重。具体来说,在传统的卷积操作中,每个卷积核都需要与输入张量中的所有位置进行卷积计算,而在稀疏卷积中,每个卷积核只需要与输入张量中的一部分位置进行卷积计算,从而大大减少了计算量和存储需求。
稀疏卷积通常可以分为两种类型:位置稀疏卷积和通道稀疏卷积。位置稀疏卷积是指只对输入张量中的一部分位置进行卷积计算,而通道稀疏卷积是指只对输入张量中的一部分通道进行卷积计算。这两种稀疏卷积通常可以结合使用,从而进一步减少计算量和存储需求。在实际应用中,通常有两种方法来选取卷积位置:固定间隔采样和自适应采样。
固定间隔采样是一种简单但常用的方法,它通过固定间隔地采样输入张量中的位置来选取卷积位置。具体来说,给定一个固定的采样间隔,固定间隔采样会从输入张量的每个维度中等间隔地选取一部分位置,并将这些位置作为卷积位置。这种方法的优点是简单、易于实现,并且可以减少计算量和存储需求。缺点是不能适应不同的输入数据分布,因此可能会影响模型的精度。
自适应采样是一种更加高级的方法,它可以根据输入数据的分布自适应地选取卷积位置。具体来说,自适应采样通常通过一些启发式的方法来选取卷积位置,例如最大值池化、重心采样(在点云的某个局部区域内,选择与其它所有点的平均位置最接近的点)等,具体的采样策略应该根据输入张量的特点和任务需求进行选择。这些方法可以根据输入数据的分布来动态地选取卷积位置,并且能够在一定程度上提高模型的精度。缺点是计算量和存储需求较大,实现也较为复杂。
需要注意的是,稀疏卷积中的卷积位置通常是自适应采样得到的,因此每次计算时都需要重新选择卷积位置。这也是稀疏卷积相对于传统的卷积操作在计算上更加复杂的原因之一。在实际应用中,需要权衡模型的准确性和计算效率,以便在保持一定精度的前提下提高模型的计算速度。
9. 多维卷积(*D Convolution)
上述的所有卷积变体都是基于2D的,即二维卷积,主要用于处理图片数据。实际上卷积操作完全可以推广到其他维度上。下面讲解一维卷积、双向卷积、三维卷积和四维卷积。
一维卷积是卷积神经网络中常用的一种操作,主要用于处理一维序列数据,如时间序列数据、音频信号等。在一维卷积中,卷积核是一个一维的向量,可以对输入的一维序列进行卷积操作。卷积操作的过程是将卷积核从序列的左边开始移动,对每个位置进行卷积操作,得到一个新的特征值。这个过程可以用公式表示如下:
其中,表示输入序列在位置处的值, 表示卷积核在位置 j 处的权重值, m 表示卷积核的大小。
一维卷积可以使用多个卷积核来提取不同的特征,每个卷积核都会产生一个新的特征图,多个特征图会被拼接在一起,形成一个新的特征张量。一维卷积在处理一维序列数据时具有一定的优势,因为它可以捕捉到序列中局部的关联信息,并且具有一定的平移不变性,即对于相同的序列模式,无论它们出现在序列的哪个位置,一维卷积都可以将其检测出来。
双向卷积(Bidirectional Convolution)是一种基于卷积神经网络的模型,主要用于处理时间序列数据,如音频信号、文本数据等。在传统的卷积神经网络中,输入张量的信息是从左往右进行传递的,而双向卷积则引入了从右往左的传递信息,从而实现对时间序列数据的双向处理。具体地,双向卷积的实现是通过对输入张量进行前向卷积和后向卷积两个过程来完成的。其中,前向卷积是将输入张量从左到右进行卷积操作,得到一个新的张量,表示从左往右的特征信息。后向卷积则是将输入张量从右到左进行卷积操作,得到另一个新的张量,表示从右往左的特征信息。最终,这两个张量会被拼接在一起,形成一个新的特征张量,同时保留了输入张量的左右两个方向的特征信息。
双向卷积在处理时间序列数据时具有一定的优势,因为时间序列数据往往具有左右对称性,双向卷积能够更全面地捕捉序列中的信息。同时,双向卷积也可以应用于其他领域,如自然语言处理中的文本数据处理,可以帮助提高模型的性能和泛化能力。可以想象,当双向卷积配合1D卷积时,可以很好的处理文本、信号等带有时序特点的数据。
3D卷积是卷积神经网络中常用的一种操作,主要用于处理三维数据,如视频、医学图像等。在3D卷积中,卷积核是一个三维的张量,可以对输入的三维数据进行卷积操作。卷积操作的过程是将卷积核从输入数据的左上角开始移动,对每个位置进行卷积操作,得到一个新的特征值。这个过程可以用公式表示如下:
其中, xi+m,j+n,k+p 表示输入数据在位置 (i+m,j+n,k+p) 处的值, wmnp 表示卷积核在位置 (m,n,p) 处的权重值, a,b,c 表示卷积核在三个维度上的大小。
3D卷积可以使用多个卷积核来提取不同的特征,每个卷积核都会产生一个新的特征图,多个特征图会被拼接在一起,形成一个新的特征张量。3D卷积在处理三维数据时具有一定的优势,因为它可以捕捉到数据中的空间信息,并且具有一定的平移不变性,即对于相同的物体形状或纹理,无论它们出现在图像的哪个位置,3D卷积都可以将其检测出来。同时,3D卷积也可以通过不同大小的卷积核来检测不同尺度的特征,从而提高模型的性能和泛化能力。1D/2D/3D卷积的对比可视化如下图6所示。
如果继续类比下去,其实还存在4D卷积的概念。4D卷积也是卷积神经网络中常用的一种操作,它主要用于处理四维数据,如视频序列或多个图像的批量数据。这时的数据维度可表示为:[图片数量,颜色通道,图片高度,图片宽度]。在4D卷积中,卷积核是一个四维的张量,可以对输入的四维数据进行卷积操作。
卷积操作的过程是将卷积核从输入数据的左上角开始移动,对每个位置进行卷积操作,得到一个新的特征值。这个过程可以用公式表示如下:
其中, 表示输入数据在位置 处的值, 表示卷积核在位置 (m,n,p,q) 处的权重值, a,b,c,d 表示卷积核在四个维度上的大小。
类似于3D卷积,4D卷积也可以使用多个卷积核来提取不同的特征,每个卷积核都会产生一个新的特征图,多个特征图会被拼接在一起,形成一个新的特征张量。
需要注意的是,在实际应用中,通常会将4D卷积分解成两个步骤,先将输入的四维数据转换成两个三维数据,然后分别对它们进行3D卷积操作,最后将两个输出结果合并起来。这种方式可以减少计算量,提高模型的效率。