Group Convolution分组卷积

写在前面

Group Convolution分组卷积,最早见于AlexNet——2012年Imagenet的冠军方法,Group Convolution被用来切分网络,使其在2个GPU上并行运行,AlexNet网络结构如下:

AlexNet

Convolution VS Group Convolution

在介绍Group Convolution前,先回顾下常规卷积是怎么做的,具体可以参见博文《卷积神经网络之卷积计算、作用与思想》。如果输入feature map尺寸为 C ∗ H ∗ W C∗H∗W CHW,卷积核有 N N N个,输出feature map与卷积核的数量相同也是 N N N,每个卷积核的尺寸为 C ∗ K ∗ K C∗K∗K CKK N N N个卷积核的总参数量为 N ∗ C ∗ K ∗ K N∗C∗K∗K NCKK,输入map与输出map的连接方式如下图左所示,图片来自链接:

Convolution VS Group Convolution

Group Convolution顾名思义,则是对输入feature map进行分组,然后每组分别卷积。假设输入feature map的尺寸仍为 C ∗ H ∗ W C∗H∗W CHW,输出feature map的数量为 N N N个,如果设定要分成 G G G个groups,则每组的输入feature map数量为 C G \frac{C}{G} GC,每组的输出feature map数量为 N G \frac{N}{G} GN,每个卷积核的尺寸为 C G ∗ K ∗ K \frac{C}{G}∗K∗K GCKK,卷积核的总数仍为 N N N个,每组的卷积核数量为 N G \frac{N}{G} GN,卷积核只与其同组的输入map进行卷积,卷积核的总参数量为 G ∗ ( N G ∗ C G ∗ K ∗ K ) = N ∗ C G ∗ K ∗ K G * (\frac{N}{G}*\frac{C}{G}*K*K)=N∗\frac{C}{G}∗K∗K G(GNGCKK)=NGCKK,可见,总参数量减少为原来的 1 G \frac{1}{G} G1,其连接方式如上图右所示,group1输出map数为2,有2个卷积核,每个卷积核的channel数为4,与group1的输入map的channel数相同,卷积核只与同组的输入map卷积,而不与其他组的输入map卷积。

Group Convolution的用途

  • 减少参数量,分成G组,则该层的参数量减少为原来的 1 G \frac{1}{G} G1
  • Group Convolution可以看成是structured sparse,每个卷积核的尺寸由 C ∗ K ∗ K C∗K∗K CKK变为 C G ∗ K ∗ K \frac{C}{G}∗K∗K GCKK,可以将其余 ( C − C G ) ∗ K ∗ K (C−\frac{C}{G})∗K∗K (CGC)KK的参数视为0,有时甚至可以在减少参数量的同时获得更好的效果(相当于正则)。
  • 当分组数量等于输入map数量,输出map数量也等于输入map数量,即 G = N = C G=N=C G=N=C N N N个卷积核每个尺寸为 1 ∗ K ∗ K 1∗K∗K 1KK时,Group Convolution就成了Depthwise Convolution,参见MobileNet和Xception等,参数量进一步缩减,如下图所示
    global average pooling
    更进一步,如果分组数 G = N = C G=N=C G=N=C,同时卷积核的尺寸与输入map的尺寸相同,即 K = H = W K=H=W K=H=W,则输出map为 C ∗ 1 ∗ 1 C∗1∗1 C11即长度为C的向量,此时称之为Global Depthwise Convolution(GDC),见MobileFaceNet,可以看成是全局加权池化,与 Global Average Pooling(GAP) 的不同之处在于,GDC 给每个位置赋予了可学习的权重(对于已对齐的图像这很有效,比如人脸,中心位置和边界位置的权重自然应该不同),而GAP每个位置的权重相同,全局取个平均,如下图所示:
    在这里插入图片描述

参考

A Tutorial on Filter Groups (Grouped Convolution)
Interleaved Group Convolutions for Deep Neural Networks

<think>好的,我需要回答用户关于GroupConv分组卷积的实现原理的问题。首先,我得回顾一下自己已有的知识,并参考提供的引用资料,确保信息准确。 用户提到的引用中,引用[1]到[4]都涉及分组卷积的相关内容。我需要结合这些资料,整理出分组卷积的基本概念、与普通卷积的区别、具体实现方式以及优势。需要注意的是,用户可能对技术细节感兴趣,比如参数设置、计算量减少的原因等。 首先,分组卷积的定义。根据引用[1]和[4],分组卷积是将输入通道分成多个组,每个组独立进行卷积操作,之后将结果拼接。这和普通卷积所有通道一起处理不同。例如,输入通道为C,分成G组,每组处理C/G个通道,这样每个卷积核的参数会减少。 接下来,实现原理。引用[2]提到在PyTorch中使用nn.Conv2d并设置groups参数,这是关键。需要说明如何在代码中实现,比如输入输出通道数必须能被组数整除。引用[4]中的例子,输入是(10,7,7),用3x3的卷积核,输出是(20,5,5),这时分组卷积的处理方式。 然后,计算量的减少。普通卷积的参数量是C_in * C_out * K * K,而分组卷积则是G * (C_in/G) * (C_out/G) * K * K),总参数量为原来的1/G。引用[3]提到计算并行度的提升,这也是分组卷积的优势之一。 另外,需要提到深度可分离卷积作为分组卷积的特例,当分组数等于输入通道数时,每个通道单独处理,然后逐点卷积合并。这可能帮助用户理解更深层次的应用。 最后,应用场景和优势,如减少过拟合、加速训练、模型轻量化(如MobileNet)。这部分引用[1]和[3]中的内容,说明其在实际中的作用。 在整理这些点时,要确保逻辑清晰,分点说明,并自然地插入引用标记。同时,生成的相关问题需要与分组卷积相关,引导用户进一步探索。</think>### GroupConv分组卷积的实现原理 #### 1. 基本概念 **分组卷积Group Convolution)** 是一种通过将输入特征图的通道划分为多个组,并在每个组内独立进行卷积操作的方法。其核心思想是通过分组减少参数量和计算量,同时提升并行计算效率[^1][^3]。 #### 2. 与普通卷积的区别 - **普通卷积**:所有输入通道共同参与单个卷积核的计算。假设输入通道数为$C_{\text{in}}$,输出通道数为$C_{\text{out}}$,卷积核大小为$K \times K$,则参数量为$C_{\text{in}} \times C_{\text{out}} \times K \times K$[^4]。 - **分组卷积**:将输入通道划分为$G$组,每组独立进行卷积操作。每组输入通道数为$C_{\text{in}} / G$,输出通道数为$C_{\text{out}} / G$,总参数量为$G \times (C_{\text{in}} / G) \times (C_{\text{out}} / G) \times K \times K$,即**普通卷积的$1/G$**[^4]。 #### 3. 实现方式 在深度学习框架中(如PyTorch),分组卷积可通过设置`groups`参数实现: ```python import torch.nn as nn group_conv = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, groups=4) ``` - **条件**:输入通道数`in_channels`和输出通道数`out_channels`必须能被`groups`整除[^2]。 - **过程**:输入特征图按通道分为$G$组,每组单独卷积后,将结果拼接得到最终输出[^4]。 #### 4. 优势 - **减少参数量**:参数量降低为普通卷积的$1/G$,适合轻量化模型(如MobileNet)。 - **提升并行性**:各组可并行计算,加速训练和推理。 - **增强特征多样性**:分组后不同组可能学习到互补的特征[^4]。 #### 5. 与深度可分离卷积的联系 当分组数$G$等于输入通道数$C_{\text{in}}$时,分组卷积退化为**深度卷积(Depthwise Convolution)**,即每个通道单独处理,再通过$1 \times 1$卷积(逐点卷积)融合通道信息。这是MobileNet等轻量模型的核心模块[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值