【北上广深杭大厂AI算法面试题】深度学习篇…组卷积(Grouped Convolution)详解(附代码实现)(一)

【北上广深杭大厂AI算法面试题】深度学习篇…组卷积(Grouped Convolution)详解(附代码实现)(一)



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/145551342


组卷积(Grouped Convolution)详解(附代码实现)

1. 组卷积(Grouped Convolution)的背景

为什么提出组卷积?

传统 CNN(标准卷积)的计算量大
  • 标准卷积计算复杂度为 O(N² × C_in × C_out × K²),当通道数 C_inC_out 较大时,计算量过高。
参数量过多,容易过拟合
  • 如 ResNet-50 的第一层卷积有 64×3×7×7=9408 个参数,模型过大。
无法高效利用 GPU 计算
  • 标准卷积层中的所有通道都相互连接,数据依赖性强,难以并行化

解决方案:Grouped Convolution

  • 组卷积(Grouped Convolution)最早在 AlexNet(2012) 中提出,并在 ResNeXt(2017)
    **MobileNetV2(2018)**中被进一步发展。
  • 它将通道划分为 G 组,每组分别进行卷积,使得计算量大幅减少。

2. 组卷积的核心思想

  • 将输入通道 C_in 划分成 G 组,每组单独进行卷积运算。
  • 输出通道 C_out 也被划分成 G 组,每组 C_out/G 个通道。
  • 相比普通卷积,组卷积减少了参数量和计算量,使得深度网络更加轻量。

组卷积 vs 普通卷积

在这里插入图片描述

3. 组卷积的代码实现(PyTorch)

3.1 直接使用 PyTorch groups 参数

PyTorch 的 torch.nn.Conv2d 直接支持 groups 参数:

import torch
import torch.nn as nn

# 组卷积:将 64 个输入通道划分为 4 组,每组 16 个通道
grouped_conv = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1, groups=4)

# 测试输入
x = torch.randn(1, 64, 32, 32)  # 输入 (batch=1, C_in=64, H=32, W=32)
y = grouped_conv(x)
print(y.shape)  # 输出 (1, 128, 32, 32)

  • groups=4:表示 64 个通道分为 4 组,每组 16 个通道进行独立卷积。
  • out_channels=128:意味着每组输出 128/4 = 32 个通道。

3.2 手动实现组卷积

如果 PyTorch 不支持 groups,可以手动实现:

class GroupedConv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, groups):
        super(GroupedConv2D, self).__init__()
        assert in_channels % groups == 0 and out_channels % groups == 0, "通道数必须整除 groups"
        
        self.groups = groups
        self.group_in_channels = in_channels // groups
        self.group_out_channels = out_channels // groups

        self.convs = nn.ModuleList([
            nn.Conv2d(self.group_in_channels, self.group_out_channels, kernel_size, padding=kernel_size//2)
            for _ in range(groups)
        ])
    
    def forward(self, x):
        # 按组分割通道
        split_x = torch.chunk(x, self.groups, dim=1)  # 按通道分割为 groups 组
        out = [conv(split_x[i]) for i, conv in enumerate(self.convs)]  # 每组分别进行卷积
        return torch.cat(out, dim=1)  # 拼接所有组的输出

# 测试
x = torch.randn(1, 64, 32, 32)
grouped_conv = GroupedConv2D(in_channels=64, out_channels=128, kernel_size=3, groups=4)
y = grouped_conv(x)
print(y.shape)  # (1, 128, 32, 32)

下节请参考:【北上广深杭大厂AI算法面试题】深度学习篇…组卷积(Grouped Convolution)详解(附代码实现)(二)

更多推荐