本文详细总结CNN中各类卷积,旨在指导 domain-specific 更好的模型设计,包括标准卷积,分组卷积(Group Conv),深度可分离卷积(Depthwise Separable Conv),转置卷积(Transposed Conv),空洞卷积(Dilated Conv),可变形卷积(Deformable Conv),和 特征重标定技术(Squeeze-and-Excitation)。
关于CNN网络的总结可以去康康这篇良心博客哦:《一文总结经典卷积神经网络CNN模型》
标准卷积
这没什么好说的,回顾一下卷积的基本概念:
- Kernel Size: 内核大小定义了卷积的 视域 。2D的常见选择是3,即3x3像素。
- Stride: 定义了内核在遍历图像时的 步长 。虽然它的默认值通常是1,但我们可以使用2的步长来对图像进行采样,类似于MaxPooling。
- Padding: 填充 定义了如何处理样本的边界。(padding=1,kernel size=3)的卷积将保持空间输出维度等于输入维度。
- Input & Output Channels: 输入通道(I),输出通道(O,就是该层有多少个卷积核,决定着下一层的输入通道),该层所需的参数可以用IOK来计算,其中K等于单个内核中单个通道的参数个数。
记住下面这个公式就行,单个维度(例如宽度或高度):
分组卷积(Group Conv)
它将输入特征图(input feature map)分成多个组,然后在每个组内独立进行卷积操作。这种方法最初是在AlexNet中提出的,以解决当时的GPU内存限制问题,后来被发现可以增加网络的表示能力并减少计算量。
在标准卷积中,卷积核会跨越所有输入通道(input channels)进行卷积。而在分组卷积中,假设有 G 个组,则输入特征图和卷积核都会被分成 G 个组。每组卷积核只在对应的输入特征图组内进行卷积操作,因此,每个卷积核不再跨越所有输入通道,而只跨越部分通道,理论上计算量减少 G 倍。
不过,分组卷积也有一个潜在的问题:
虽然在理论上它可以显著降低一计算量,但是对内存的访问频繁程度并未降低,且现有的GPU加速库(如cuDNN)对其优化的程度有限,因此它在效率上的提升并不如理论上显著。
深度可分离卷积(Depthwise Separable Conv)
分组卷积的一种特例,其中每个输入通道分配给一个组(就是 G=C,每个通道单独一个组)。深度可分离卷积首先使用逐通道深度卷积(depthwise)提取空间特征,然后使用 1×1 逐点卷积(pointwise)合并这些特征。这种方法首次被广泛认知是通过MobileNet架构和Xception架构,以显著减少计算量和模型大小。
计算量分析
所以:
标准卷积的计算量(即乘法操作的数量)大约为:
深度可分离卷积的总计算量为 深度卷积 和 逐点卷积 之和:
深度可分离卷积的计算效率提升可以用如下的比例表示:
简化后得到:
Cout一般很大,可以忽略,而Dk一般是3,所以一般至少能 节省9倍 计算量。
在MobileNet V2中,网络做了一点改进:
先点卷积扩大通道数,以提取更多的特征,再应用深度可分离卷积;还有加了残差结构(图中没有展示)。
转置卷积(Transposed Conv)
转置卷积可以理解为 反卷积,可以视为标准卷积的逆过程,在 图像生成(如生成对抗网络GANs和变分自编码器VAEs)、图像分割 等领域中非常有用,因为这些应用通常需要从一个较小的特征表示恢复到较大的图像尺寸。
在标准卷积中,卷积核在输入特征图上滑动,对局部区域进行加权求和,从而产生更小的输出特征图(除非特别采用零填充等手段)。
相反,转置卷积通过给定的步长在输入特征图中插入零,然后应用一个卷积核,其效果是 “扩展” 了输入特征图。
具体地,它首先将输入特征图中的每个元素视为小的特征图,并在这些特征图之间插入由步长确定的零填充,然后对这个新的、被扩展的特征图应用标准卷积。这样,转置卷积实际上是通过在原始输入元素之间插入空白(通常是零)来“逆转”标准卷积的压缩效果。
普通卷积和转置卷积所处理的基本任务是不同的:
- 前者主要用来做特征提取,倾向于压缩特征图尺寸;
- 后者主要用于对特征图进行扩张或上采样。
尽管转置卷积是上采样的有效手段,但它可能引入特定的伪影,如棋盘状伪影(checkerboard artifacts)。
这是由于步长和卷积核大小不匹配时输出特征图中值的不均匀分布导致的。即当内核大小(输出窗口大小)不能被步幅(顶部点之间的间距)整除时,反卷积具有不均匀的重叠。
为了缓解这一问题,设计转置卷积层时需要仔细选择卷积核大小和步长,或考虑使用其他上采样技术(如双线性上采样后跟一个 1×1 卷积)作为替代。
空洞卷积(Dilated Conv)
也称为扩张卷积,旨在增加卷积层的感受野(即卷积操作覆盖的输入区域大小)而不增加额外的参数或计算量。这种方法通过在卷积核的元素之间插入空洞(即零填充),实现了在不丢失分辨率的情况下捕获更广泛的上下文信息,也用于做像素级的预测,解决pixel-wise输出模型。
在标准卷积中,卷积核的元素是紧密排列的。而在空洞卷积中,卷积核被“扩张”了,卷积核中的元素之间插入了指定数量的空间(零填充),这个数量由一个参数——空洞率(dilation rate)决定。空洞率为1表示标准卷积(没有空洞),空洞率大于1表示在卷积核元素之间插入的空洞数量。
工作原理:
假设空洞率为 d,则在卷积核的每个元素之间将插入 d−1 个零。这意味着,对于一个 3×3 的卷积核,当空洞率为2时,实际上卷积操作会在一个 5×5 的区域上进行,但只有原 3×3 卷积核对应的位置参与计算,其他位置被认为是零。这样,卷积核覆盖的实际区域更大,从而增大了感受野,而不需要增加更多的参数或计算成本。
应用:
- 语义分割:FCN等网络就是利用空洞卷积来增加感受野,以提高分割的精确度。
- 音频处理:在音频生成和语音识别中,如Wavenet,空洞卷积可以帮助模型捕捉到更长的序列依赖。
虽然空洞卷积有其优势,但在使用时也需要注意一些问题,如:
- 感受野爆炸:随着空洞率的增加,感受野可能迅速扩大,可能导致模型覆盖过多的输入区域,从而捕获到过多的无关信息或噪声。
- 棋盘效应(Gridding Effect):当连续使用高空洞率的卷积层时,可能会出现棋盘效应,即模型只能看到输入数据的一部分,导致性能下降。为避免这一点,设计网络时应仔细考虑空洞率的选择和层次结构的安排。
可变形卷积(Deformable Conv)
传统的卷积操作在进行特征提取时使用固定形状的卷积核,这可能限制了模型处理图像中的几何变换(如物体的形状变化、尺度变化和旋转)的能力。可变形卷积通过引入了可学习的偏移量,使得卷积核的形状和位置可以动态地调整以适应输入图像的几何变化。这种方法最初是在《Deformable Convolutional Networks》一文中提出的,目的是增强卷积神经网络对于尺度、旋转和形状变化的适应能力。
这使得卷积核能够自适应地调整其形状来更好地拟合图像的局部特征。
正常卷积规律的采样 9 个点(绿点),在正常的采样坐标上加上一个位移量(蓝色箭头),可变形卷积可以进行尺度变换,比例变换和旋转变换,即上面介绍的空洞卷积是它的一个特例。
具体地:
- 可变形卷积层通过额外的卷积层来预测每个采样点的偏移量,这些偏移量是相对于卷积核中每个位置的标准固定网格位置的。偏移量是可以通过反向传播算法学习和优化的,使得网络能够在训练过程中自动学习到如何变形卷积核以适应具体任务的需求。
- 由于偏移后的位置通常不会正好落在输入特征图的像素上,可变形卷积使用双线性插值来计算偏移位置处的输入值,确保操作的可微性,允许梯度的正常反向传播。
简单来说:首先通过一个小卷积层(绿色)的输出得到可变形卷积所需要的位移量,然后将其作用在卷积核(蓝色)上,达到可变形卷积的效果。
优势:
- 几何变换适应性:可变形卷积能够使卷积核适应输入特征图中的局部几何变换,提高了模型处理图像形变的能力。
- 增强的特征提取:通过动态调整卷积核,模型能够捕捉到更加丰富和精细的特征,有助于提升诸如目标检测、语义分割等视觉任务的性能。
同样思路也能用在池化上,搞成可变形池化:
通过标准的兴趣区域池化(绿色)获得兴趣区域对应的特征,该特征通过一个全连接层得到兴趣区域每个部位的位移量。用该位移作用在可变形兴趣区域池化(蓝色)上,以获得不局限于兴趣区域固定网格的特征。
虽然可变形卷积提供了强大的几何变换适应能力,但它也引入了额外的计算和参数,这可能会增加模型的训练难度和计算成本。因此,在实际应用中需要根据任务的具体需求和资源限制权衡其使用。
特征重标定技术(Squeeze-and-Excitation)
ImageNet 2017 竞赛 Image Classification 任务的冠军模型SENet(Squeeze-and-Excitation Networks)中的特征重标定策略,通过引入一个称为“Squeeze-and-Excitation”(SE)模块的结构,对卷积神经网络中的特征通道进行动态重标定。这种机制能够显著提高网络对特征重要性的适应能力,增强了模型的学习和表达能力,进而提高网络的性能。
这种卷积方法创新地对特征维度进行改进,通过自动学习评估每个特征通道的重要性,从而在千余个卷积核中区分并强化对当前任务有利的特征,同时抑制不太相关的信息。
Squeeze阶段:
SE模块首先通过全局平均池化(Global Average Pooling)对每个特征通道进行“压缩”,将每个通道的空间维度(即宽度和高度)压缩为一个单一的数值,生成一个长度为C的向量,这个向量中的每个值反映了相应特征在全局上的平均激活程度,这一步骤有助于模块捕捉到通道级的全局信息。
Excitation阶段:
紧接着,通过一个全连接层、ReLU激活、另一个全连接层和sigmoid激活来进行“激励”操作,这两层作为网络的一部分需要额外学习其参数,这个过程生成每个通道的权重系数。这些权重系数用于动态地调整每个通道的重要性,使网络能够专注于更有用的特征。
重标定:
最后,原始特征图通过与这些学习到的通道权重相乘,进行重标定,即按通道进行加权,从而增强有用的特征并抑制不重要的特征。