【北上广深杭大厂AI算法面试题】深度学习篇...组卷积(Grouped Convolution)详解(附代码实现)(一)
·
【北上广深杭大厂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_in和C_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)详解(附代码实现)(二)
更多推荐


所有评论(0)