☰
卷积神经网络变种全解析:从分组卷积到门控卷积
2026/10/3 1:05:38 网站建设 项目流程

1. 从一次面试聊起:为什么卷积变种如此重要

前阵子帮团队做技术面试,上来问了一个很基础的问题:“标准卷积和深度可分离卷积的参数量差别有多大?”结果候选人能把定义背得滚瓜烂熟,但问到“为什么MobileNet要用它替代标准卷积,计算量究竟省在哪一步”的时候,明显卡壳了。这其实不是个例。很多朋友在学卷积神经网络时,都能把“分组卷积”“空洞卷积”“转置卷积”的名字和公式背下来,但一落到实际场景里,到底选哪个、为什么这么选、参数量和感受野怎么算,就一团浆糊了。

这篇文章我想把标题里提到的这些卷积变种完整梳理一遍——分组卷积、深度可分离卷积、空洞卷积、转置卷积都会覆盖,顺手把3D卷积、可变形卷积、图卷积和门控卷积这4个高频出现的扩展变种也一并讲掉。目标只有一个:让读完的人,不只是“见过”这些名字,而是能真正在项目里做出合理的技术选型。我尽量用实际案例和计算过程来讲,避免空谈理论。

2. 标准卷积的地基:参数量、FLOPs和感受野

要说清楚各种变种,得先把标准卷积的各项指标算明白。这不是浪费时间,因为后面每一个变种的提出,本质上都是在动标准卷积的三个核心参数:卷积核尺寸、通道数、输出特征图尺寸。

2.1 输出尺寸与参数量的计算公式

拿一个常见场景举例,输入是 H=224、W=224、通道数 C_in=3 的图片,卷积核尺寸 K=3,padding=1,stride=1,输出通道数 C_out=64。输出特征图的边长计算公式是:

(H - K + 2 * padding) / stride + 1

代入就是 (224 - 3 + 2) / 1 + 1 = 224,尺寸不变,这个大家应该很熟了。关键在于参数量,标准卷积的参数量是:

C_in * C_out * K * K

也就是 3 × 64 × 3 × 3 = 1728,如果有偏置再加64。这个数不算大,真正吃显存的是FLOPs。FLOPs的计算方式是:

C_out * H_out * W_out * C_in * K * K

也就是 64 × 224 × 224 × 3 × 3 × 3,算下来约866M次乘加操作。注意这里面有个容易被忽略的点:FLOPs是跟在特征图空间尺寸上累乘的,所以空间尺寸越大,计算量膨胀得越快,这也是后面所有“省计算量”变种的发力方向。

2.2 感受野的基础认知

感受野这个概念,简单说就是输出特征图上某个点,最多能看到输入图像上多大的区域。标准卷积、stride=1、kernel=3,连续堆两层,感受野是多少?不是3+3=6,而是5。准确公式是:

RF_l = RF_{l-1} + (K_l - 1) * \prod_{i=1}^{l-1} stride_i

所以stride对感受野的放大是累乘的,kernel对感受野的贡献是线性的。你堆两层3×3,等效于一层5×5的感受野,但参数量从25降到18,这其实也是VGG和ResNet疯狂堆小卷积核的理论基础。后面讲空洞卷积时,你会看到它就是用“不增加参数量、不增加计算量”的方式,直接把感受野拉大的。

3. 分组卷积:从AlexNet到ResNeXt的进化史

分组卷积可能是所有变种里最好理解的一个。它做的事情简单粗暴:把输入在通道维上切成G组,每组独立做标准卷积,最后在输出通道维上拼回去。

3.1 参数量和计算量砍掉多少倍

输入 H=224, W=224, C_in=256,输出 C_out=256,K=3,不分组时的参数量是 256 × 256 × 3 × 3 = 589,824。分成G=32组,每组处理 C_in/G=8 个输入通道,输出 C_out/G=8 个通道,单个卷积核尺寸仍是3×3,但卷积核数量只有 8 × 8 = 64 个,再乘G组,总参数量是:

256 × 256 × 3 × 3 / 32 = 18,432

直接把参数量除以了G。计算量同样除以G,因为每组只在 224×224×8 的特征图上做 3×3 卷积,输出也是 224×224×8。这里有个很有意思的工程背景:AlexNet当年提出分组卷积,首要目的其实是突破单个GPU显存的限制,把模型切成两半放到两张显卡上跑。但后来大家发现,分组卷积本质上给网络引入了一种“稀疏的结构先验”,通道间的信息流通被切断了,于是就有了后面ShuffleNet的channel shuffle操作来恢复跨组信息流通。

3.2 ResNeXt和分组卷积的“宽度”哲学

ResNeXt是我个人觉得最优雅的一个分组卷积应用。它没有去发明新的模块,只是把ResNet的3×3卷积层换成了分组卷积,然后引入了一个叫“基数”的超参数 cardinality。论文里有个很关键的实验:当你把cardinality从1升到32,同时相应降低每个分组的宽度,模型精度不降反升。这说明什么?说明在相同参数量下,让网络“做更多组独立的映射”比单纯“做更宽的映射”更有效。

实操时有个小建议:如果你在做移动端或者实时推理任务,又不想引入复杂的SE模块或注意力机制,可以先把ResNet的3×3卷积改成G=8或G=16的分组卷积,网络结构一行代码都不用动,参数量直接砍掉一大截。我试过在检测模型的backbone上做这个改动,mAP掉了大概0.5个点左右,但推理速度提升了约30%,在很多业务场景下这个trade-off完全可以接受。

3.3 分组卷积的坑

分组卷积有一个必须注意的问题:当G=C_in=C_out时,它就退化成完全独立的通道级卷积,也就是后面要讲的深度卷积。这种极端分组会彻底切断通道间信息交互,表达能力会明显下降。所以实际工程里,分组卷积后面通常都会跟一个1×1的点卷积来“混通道”,ResNeXt、MobileNet、ShuffleNet都是这个套路。

4. 深度可分离卷积:移动端的算力救星

深度可分离卷积,我愿称之为“卷积变种里工程价值最高”的一个。它把标准卷积拆成两步:第一步是深度卷积,逐通道做空间卷积;第二步是1×1点卷积,跨通道加权组合。

4.1 计算量的对比计算过程

还是用输入 224×224×64、输出 64 通道、K=3 这个例子。标准卷积FLOPs是:

64 × 224 × 224 × 64 × 3 × 3 ≈ 1.81B

深度可分离卷积拆开算。深度卷积的FLOPs是:

64 × 224 × 224 × 3 × 3 ≈ 28.9M

点卷积的FLOPs是:

64 × 224 × 224 × 1 × 1 × 64 ≈ 1027.6M

两者相加约1.06B,比标准卷积少了约40%。如果输入输出通道都是256,倍数差异会更极端,标准卷积是 256×256×9×H×W,深度可分离是 256×(9+256)×H×W,所以通道数越大,深度可分离卷积的计算量优势越明显。MobileNet V1就是靠这个结构,在ImageNet上以不到ResNet-50一半的FLOPs,拿到了接近的精度。

4.2 为什么MobileNet V2要加倒残差结构

这里有个经验性的关键点:直接把VGG或者ResNet里的卷积层全换成深度可分离卷积,效果通常不会太好。MobileNet V2给出的解决方案是“倒残差结构”(Inverted Residual Block):先把低维特征1×1升维到高维,做深度卷积,再1×1降维回低维。这个顺序和ResNet正好相反,ResNet是先降维、再卷积、再升维。为什么?因为深度卷积在高维空间做特征提取更充分,而它的计算量只跟卷积核尺寸和特征图空间大小有关,跟在多少维上做关系不大——所以升维做深度卷积,计算量涨得有限,但特征表达能力提升明显。

我踩过的坑是:在低算力设备上,直接把ResNet的bottleneck替换成倒残差结构,发现推理速度提升没有预期大。后来排查发现,罪魁祸首是低维端到高维端的1×1卷积在通道数较高时也相当耗时,而且倒残差结构在最后降维层用了线性激活(去掉了ReLU),因为ReLU在低维空间会过度造成信息丢失。这些小细节,只看结构图是看不出来的,必须自己跑一遍才知道。

4.3 工程中的适用边界

深度可分离卷积不是万能的。首先,它对卷积核的实现优化有要求,在GPU上如果底层没有做implicit gemm优化,加速效果可能不理想;但在手机端的CPU推理引擎里,深度可分离卷积通常能拿到非常好的加速比。其次,当输出通道本身就很小时,1×1卷积占的比重下降,深度可分离的整体优势会被稀释。所以在做异构平台部署时,我一般会先跑一遍profiling,用实际推理时间说话,不要在纸面上空算。

5. 空洞卷积:感受野和分辨率之间的跷跷板

空洞卷积(Dilated/Atrous Convolution),一句话理解就是在卷积核的相邻元素之间插入空洞,从而在不增加参数量的前提下扩大感受野。它最常见的使用场景是语义分割和检测任务里,需要在不下采样的前提下保特征图分辨率。

5.1 空洞率rate是怎么工作的

假设卷积核尺寸K=3、rate=1,就是普通卷积;rate=2表示在原始卷积核的每个元素之间隔一个位置取点,等效卷积核尺寸变为:

K + (rate - 1) * (K - 1)

所以3×3、rate=2的等效尺寸是 3 + (2-1)(3-1) = 5。rate=4时等效尺寸是 3 + 3(2) = 9。参数量呢?仍然是9个权重,一个都没多。这合算得离谱——官方深度的含义就是,你用3×3的参数量,获得9×9的感受野。

空洞卷积的感受野递推公式和标准卷积一样,只是K要换成等效尺寸。比如连续两个3×3、rate=2的空洞卷积,感受野是 5+4=9,而两个标准3×3卷积的感受野只有5。这就是为什么DeepLab系列敢在最后几个stage用rate=2甚至rate=4的空洞卷积,保持特征图只有1/8下采样,同时感受野还能覆盖大目标。

5.2 网格效应和心理场“盲点”

空洞卷积最大的坑是网格效应(gridding effect)。因为参与计算的像素点之间有空洞,相邻的输入像素实际上是“隔一个取一个”的,当多个rate相同的空洞卷积堆叠时,有些像素会永远不参与某个输出点的计算,导致模型对小目标、细长结构的感知出现规律性盲点。

解决这个问题有几种常见方案:

  • 混合空洞卷积(HDC):连续层的rate不要相同,比如用1、2、5这样的递增序列,且rate的最大公约数尽量小,让空洞的采样位置在多层叠加后能覆盖更全。
  • 多头空洞卷积:并行使用不同rate的空洞卷积,再把结果拼接,类似ASPP(Atrous Spatial Pyramid Pooling)。
  • 与标准卷积交替使用:把空洞卷积层和普通卷积层穿插起来,因为普通卷积能填补空洞区域的信息盲区。

实操上,如果数据集里有大量中小尺寸的物体,我建议空洞率不要设得太大,rate=2、3就够用了,rate=6、12那种“大杀器”往往只对大型物体有效,对密集小目标几乎是灾难。DeepLab V3之所以稳,本质上就是因为ASPP把多个rate并行组合,互相补偿了各自的盲区。

5.3 空洞卷积在检测任务里的使用心得

目标检测里也经常用空洞卷积。以FCOS、CenterNet这类anchor-free检测器为例,它们常常会在backbone的最后一个stage接上空洞卷积,让下采样倍数从16倍降到8倍,同时保持特征图尺寸足够大,保证对小目标的召回。但要注意,特征图变大意味着后续head也要跟着跑在更大的特征图上,整体显存和耗时都会上升,不是白拿的。所以实际设计时,我只对着关键的那几个层做rate调整,比如C4和C5层,而不是像语义分割那样全网络都用空洞卷积。

6. 转置卷积:从低分辨率放大到高分辨率

转置卷积(Transposed Convolution),也叫反卷积(Deconvolution)、分数步卷积(fractionally-strided convolution),是生成模型、超分辨率、语义分割、目标检测分割head中最常见的上采样操作。它做的事情可以理解成“把卷积运算的反向传播过程当成前向计算来跑”,所以从数学上讲,它是标准卷积的“梯度转置”操作,而不是一个真正意义上的逆操作。

6.1 转置卷积的输出尺寸计算

输入尺寸 H_in,卷积核K、stride、padding,输出尺寸的计算公式是:

H_out = (H_in - 1) * stride - 2 * padding + K

也就是说,stride决定了对输入进行多少倍的上采样。stride=2时,输出空间尺寸约是输入的两倍。这条公式很多朋友用不熟的原因是边界情况太多,其实你只要有一个简单的对照样例就能推出来,不必死记。

举个例子,输入 H=5, K=3, stride=2, padding=1,则:

H_out = (5 - 1) * 2 - 2 * 1 + 3 = 8 - 2 + 3 = 9

从5放大到9,接近2倍。反着算一下,9×9的特征图,K=3、stride=2、padding=1的标准卷积,输出是 (9 - 3 + 2)/2 + 1 = 5,确实是对齐的。

6.2 棋盘效应与参数初始化陷阱

转置卷积最大的坑是“棋盘伪影”,尤其在使用固定的upsample操作如nn.Upsample后跟普通卷积时不太会出现,但在直接使用转置卷积时很容易发生。原因是卷积核尺寸和stride之间产生重叠区域,某些位置的权重叠加不均匀,导致输出图像出现条纹状或棋盘状的明暗块。

缓解办法有几种:

  • kernel_size能整除stride:比如stride=2时用kernel=4,stride=3时用kernel=6,能有效降低重叠区域的不均匀。
  • 先双线性插值上采样,再接标准卷积:这是我在分割项目里最常用的方式,效果稳定且训练更好收敛。
  • 对转置卷积的权重做特殊初始化:比如用bilinear初始化,或者直接固定成双线性系数,只在后接卷积层学习非线性。

另外,转置卷积层很容易在小数据集上过拟合,因为它的参数量和标准卷积相同,但输出维度更大,等价于在做一种“带学习的上采样”。如果数据集不大,我建议把它替换成固定上采样+普通卷积的组合,速度和精度通常都有改善。

6.3 转置卷积在AutoEncoder和GAN中的角色

在AutoEncoder类的网络里,encoder负责把图像压缩成紧凑的隐向量,decoder的网络就是靠转置卷积一步步把隐向量恢复成原图尺寸。在GAN的生成器里,转置卷积同样是把噪声向量逐渐放大成图像的标配。但最近一两年,很多新架构(比如Diffusion Model)在生成图像时反而不太用转置卷积了,而是更偏重组合插值+卷积的方式。原因还是棋盘效应和训练不稳定问题。所以我的建议是:如果只是做语义分割、FCN这种结构化预测,转置卷积或者插值+卷积都可以;如果是做图像生成,优先考虑插值放大+卷积的组合。

7. 四个你迟早要碰到的“高级变种”

既然标题写了“最全”,那我不把剩下几个高频变种讲完总觉得差点意思。下面这几个其实也都是卷积思路在不同维度的延伸,理解难度不高,但工程价值很大。

7.1 3D卷积:视频和医学影像的默认选择

3D卷积就是把2D的kernel扩展到3D,卷积核尺寸变成 K_d × K_h × K_w,输入也变成 D×H×W 的立体。它的参数量公式是:

C_in * C_out * K_d * K_h * K_w

计算量同样多乘一个帧维度的尺寸。3D卷积通常用在视频分类、行为识别、医学CT影像等数据本身就是立体的场景。缺点也很明显:参数量和计算量都比2D卷积大一个数量级,所以实际部署时常用3D卷积的“轻量化”版本,比如P3D、S3D,它们把3D卷积拆成2D空间卷积+1D时间卷积,大幅减少计算量。

7.2 可变形卷积:让卷积核学会“变形”

可变形卷积的思路很直观:标准卷积的采样位置是固定的矩形网格,但如果目标的几何形变很剧烈,这个网格并不贴合实际的物体轮廓。可变形卷积的做法是,用一个小网络额外学习每个采样点的偏移量,让卷积核的采样点在空间上“自适应地移动到更合理的位置”。

这个变种在检测和分割任务里效果确实好,尤其对非刚性物体(人体姿态、医学器官)提升明显。但代价是:偏移量的计算需要额外的卷积层,而且这个偏移量是动态生成的,无法在部署阶段提前缓存,所以推理时会有额外的计算开销。如果你用的是TensorRT或者OpenVINO做部署,这个算子有时不被原生产品支持,得自己实现插件,这算是工程落地时的隐性成本。

7.3 图卷积:处理非网格数据的“亲民派”

图卷积不是用来处理图像那种规整网格的,而是处理图结构数据,比如社交网络、分子结构、知识图谱等。它和前面所有变种都不在一个赛道——前面说的是“如何改进卷积在网格数据上的效率”,而图卷积解决的是“如何在非欧氏空间定义卷积”的问题。

它的核心公式并不复杂,大致可以理解为:每个节点的特征,由它自己和邻居节点的特征加权求和而得。权重矩阵和邻居的聚合方式(比如GCN用的标准化邻接矩阵)决定了信息传播的路径。做图卷积网络时,有个我觉得很实用的自检方法:先拿一个只有几十个节点的小图跑通模型,把聚合的矩阵乘法手算一遍,你会发现整个梯度回传和参数更新的逻辑都非常清晰,跟图像卷积的“局部连接+权重共享”思想完全一致。

7.4 门控卷积:给卷积加一道“信息阀门”

门控卷积(Gated Convolution)的灵感来自LSTM中的门控机制,它在普通卷积之后,额外用另一个卷积生成一个0到1之间的门控掩码,然后对原特征做逐元素相乘。这样网络就能学会“哪些位置的信息应该放行,哪些应该抑制”,非常适合语言建模、图像修复、超分辨率等任务。

门控卷积的实操注意点是:门控卷积会比其他模块更容易受调度策略影响,训练时对学习率比较敏感。如果发现训练初期loss波动剧烈,尝试把学习率调低一个数量级,或者用warmup策略,通常会稳定很多。

8. 五分钟掌握选型脉络:输出尺寸与参数量速查

给各位做一个很直接的速查表,方便把前面这些内容沉淀成决策依据。“速查表”针对的是刚把这些变种学完、准备在项目里动手的朋友;等用熟了,这些数据你基本都能心算出来。

变种输出尺寸公式参数量(相比标准卷积)FLOPs(相比标准卷积)主要用途
标准卷积(H-K+2P)/S+1基准基准通用特征提取
分组卷积同标准卷积降低G倍降低G倍多GPU并行、大网络轻量化
深度可分离卷积同标准卷积远低于标准卷积远低于标准卷积移动端轻量网络
空洞卷积(H-K_eff+2P)/S+1不随rate增加不随rate增加分割、检测、保持分辨率
转置卷积(H-1)*S-2P+K同标准卷积同量级上采样、生成网络
3D卷积(T-K_d+2P_d)/S_d+1随K_d增加随K_d增加视频、医学影像
可变形卷积同标准卷积额外偏移层额外偏移层形变目标检测分割
图卷积依赖图邻接矩阵与节点数无关随边数变化非网格结构数据
门控卷积同标准卷积约2倍约2倍语言建模、图像修复、超分

这张表不是让你背的,而是让你在设计网络的时候能快速筛选。比如你要做移动端分类,第一优先级是深度可分离卷积;做语义分割想要大感受野又不想降低分辨率,优先看空洞卷积;需要从低分辨率特征恢复原图,就选转置卷积或者插值+卷积。凡是选项清晰、动机清晰的项目,通常不会出大偏差。

再补充一条关于输出尺寸的经验,之前调试一个生成网络时,无论怎么设计转置卷积的层数,输出的图片总是有一侧边缘偏暗。排查半天,发现是padding设置导致每层多出了一点不对称的尺寸偏移,最终在多层堆叠下累积成了严重的边缘伪影。这件事让我养成了一个习惯:在设计带转置卷积的网络前,一定先用公式把每一层输入输出尺寸算一遍,确保每个维度都是整数,不对称的padding宁可补在特征图两侧也不要在卷积参数里凑数。

9. 路线之外的实操经验总结

这些变种不是孤立的知识点,它们的提出时间线其实反映了一条清晰的技术演进主线:从“让网络更深更宽”到“让同样的参数量发挥更大作用”,再到“让网络结构去适配数据的几何特性”。分组卷积和深度可分离卷积是在“省”字上下功夫;空洞卷积和转置卷积是在“多”字上做文章,一个让感受野变大,一个让空间尺寸变大;可变形卷积和图卷积则是把卷积的定义边界外扩到非网格和动态采样区域。

我个人的建议是:与其在项目里同时引入五六个变种堆一个大杂烩网络,不如只挑出当前任务最需要优化的一到两个点,把对应变种用透。比如做分割任务,就老老实实把空洞卷积和多尺度融合玩明白;做移动端任务,就把深度可分离卷积和通道剪枝结合好。真正导致项目失败的往往不是模型精度不够,而是结构太复杂、debug困难、部署不支持。

最后分享一个调试技巧:新引入一个卷积变种的时候,先在单个block上做小实验,用相同的输入输出维度对比标准卷积和变种结构的输出差异、训练收敛速度,再决定是否放到完整网络里。这一步花不了多少时间,但能帮你避开很多“从头训练一轮才发现模块有问题”的尴尬时光。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询