在深度神经网络中,传统卷积层通过跨通道的全局交互提取特征,但其计算复杂度与参数量随通道数呈二次增长。比如输入有 256 个通道,输出 512 个通道时,每个输出通道都需要和所有输入通道 “互动”,这会导致参数量和计算量变得非常大,导致:
分组卷积就像把一个大团队分成多个小团队,每个小团队只负责一部分工作。具体来说:
分组处理:把输入通道和输出通道分成若干组(比如分成 4 组),每组独立进行卷积操作。比如输入 256 个通道分成 4 组,每组 64 个通道;输出 512 个通道也分成 4 组,每组 128 个通道。
独立计算:每个小组的卷积核只处理自己组内的输入通道,生成对应的输出通道,组与组之间不交叉。
结果合并:最后把各个小组的输出结果合并,得到最终的特征图。
ResNext在ResNet残差连接的基础上引入基数(Cardinality) 作为新维度,通过增加分组数 (G) 而非单纯扩大通道/深度,实现“宽度-深度-基数”的平衡。核心创新点:
每个分支执行“降维-卷积-升维”的标准瓶颈操作:
# 单个分组卷积分支(以2D卷积为例)
nn.Sequential(
nn.Conv2d(in_channels, bottleneck_channels, 1, bias=False), # 降维
nn.BatchNorm2d(bottleneck_channels),
nn.ReLU(inplace=True),
nn.Conv2d(bottleneck_channels, bottleneck_channels, kernel_size,
stride, padding, groups=G, bias=False), # 分组卷积
nn.BatchNorm2d(bottleneck_channels),
nn.ReLU(inplace=True),
nn.Conv2d(bottleneck_channels, out_channels, 1, bias=False), # 升维
nn.BatchNorm2d(out_channels)
)
groups=G
,实现通道分组计算 ResNext Block将 (G) 个分支的输出沿通道维度拼接(或逐元素相加),这种设计使每个分支专注于局部通道组的特征提取,最终通过聚合获得全局感知能力。
与ResNet一致,通过Shortcut路径处理维度匹配问题:
以典型的ImageNet分类架构为例,ResNext-50的层级配置如下:
阶段 | 输入尺寸 | 分组数 (G) | 通道数变化 | 模块数量 | 操作类型 |
---|---|---|---|---|---|
输入层 | (224×224×1) | 3→64 | 1 | 7x7卷积+最大池化 | |
残差层1 | (56× 56 × 64) | 32 | 64→256 | 3 | ResNext Block |
残差层2 | (28 ×28 ×256) | 32 | 256→512 | 4 | ResNext Block |
残差层3 | (14 ×14 ×512) | 32 | 512→1024 | 6 | ResNext Block |
残差层4 | (7 × 7×1024) | 32 | 1024→2048 | 3 | ResNext Block |
输出层 | (1 × 1× 2048) | 全局平均池化+全连接 | 1 | 分类预测 |
关键设计原则:
import torch
import torch.nn as nn
class GroupedConvolution(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size,
stride=1, padding=0, groups=1):
super(GroupedConvolution, self).__init__()
self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size,
stride, padding, groups=in_channels, bias=False)
self.conv2 = nn.Conv2d(in_channels, out_channels, 1, bias=False)
self.bn = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
x = self.conv1(x) # 分组内卷积(通道不交叉)
x = self.conv2(x) # 跨组通道整合
x = self.bn(x)
return self.relu(x)
groups=in_channels
实现每个输入通道独立卷积(等效于深度可分离卷积的深度层) class ResNextBlock(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size,
stride=1, groups=32, bottleneck_ratio=4):
super(ResNextBlock, self).__init__()
bottleneck_channels = out_channels // bottleneck_ratio
self.groups = groups
# 主路径:G个并行分支
self.group_convs = nn.ModuleList([
nn.Sequential(
nn.Conv2d(in_channels, bottleneck_channels, 1, bias=False),
nn.BatchNorm2d(bottleneck_channels),
nn.ReLU(inplace=True),
nn.Conv2d(bottleneck_channels, bottleneck_channels, kernel_size,
stride, (kernel_size//2), groups=1, bias=False), # 组内卷积
nn.BatchNorm2d(bottleneck_channels),
nn.ReLU(inplace=True),
nn.Conv2d(bottleneck_channels, out_channels, 1, bias=False)
) for _ in range(groups)
])
# Shortcut路径
self.shortcut = nn.Sequential()
if in_channels != out_channels or stride != 1:
self.shortcut = nn.Sequential(
nn.Conv2d(in_channels, out_channels, 1, stride, bias=False),
nn.BatchNorm2d(out_channels)
)
def forward(self, x):
# 并行分支计算
group_outputs = [conv(x) for conv in self.group_convs]
main_path = sum(group_outputs) # 等价于通道拼接后逐元素相加
# 残差连接
shortcut_path = self.shortcut(x)
return nn.ReLU(inplace=True)(main_path + shortcut_path)
Block
实现,通道数按1→64→128→256→512
增长,每次翻倍stride=2
的卷积逐层减半(128→64→32→16→8)AdaptiveAvgPool2d((1, train_shape[-1]))
:无论输入序列长度如何,池化后序列维度为1,特征维度(如9)保持不变,适配不同长度的输入(如时间序列的不同时间步)512 * 特征维度
(如512*9),将多维特征展平为向量,映射到类别数(如10类)指标 | 分组卷积(Grouped Conv) | 深度可分离卷积(Depthwise Separable Conv) |
---|---|---|
分组方式 | 输入/输出通道等分组 | 输入通道分组(单通道卷积+点卷积) |
组间交互 | 需1x1卷积显式整合 | 点卷积(1x1)隐式整合 |
参数量压缩比 | (1/G) | (1/C_out + 1/C_in) |
特征多样性 | 高(多组独立特征) | 中(单通道处理后整合) |
典型应用 | ResNext、SqueezeNet | MobileNet、Xception |
ResNet 靠增加层数和通道数提升性能,而 ResNext 通过增加 “基数”(分组数),用更高效的方式提升效果,同等性能下模型更轻便。残差连接保留了 ResNet 的优势,即使网络很深,也能通过跨层连接保持梯度传递,训练更容易收敛。下面,我们以UCI-HAR数据集为例,展示ResNext的实际应用及其结果。
UCI-HAR 数据集由加州大学尔湾分校实验团队构建,是行为识别领域的经典基准数据集。其数据采集依托三星 Galaxy S2 智能手机内置的加速度计与陀螺仪传感器,以 50Hz 的采样频率记录人体运动特征。该数据集包含 30 名年龄在 19-48 岁的受试者,通过腰部佩戴设备完成六种日常活动:步行、上楼、下楼、静坐、站立和静躺。本研究采用滑动窗口技术对原始数据进行预处理,设置窗口长度为 128 个采样点,滑动步长 64 个采样点(即 50% 的窗口重叠率),最终形成 748,406 个样本单元。
基于空洞卷积的模型在PAMAP2数据集上的性能如下表所示:
| Metric | Value |
| Parameters | 1,007,686 |
| FLOPs | 104.65 M |
| Inference Time | 6.53 ms |
| Val Accuracy | 0.9946 |
| Test Accuracy | 0.9883 |
| Accuracy | 0.9883 |
| Precision | 0.9886 |
| Recall | 0.9883 |
| F1-score | 0.9884 |
每个类别的准确率:
Walking: 1.0000
Jogging: 1.0000
Sitting: 0.9858
Standing: 0.9888
Upstairs: 0.9581
Downstairs: 1.0000
模型在简单动作(如 Walking、Downstairs)上表现优异,准确率接近 1;对静态或相似动作(如 Sitting、Standing)的区分准确率超过 0.98,体现了分组卷积对结构化特征的高效提取能力。对于空间动作幅度较大的 Upstairs,准确率稍低,可能与时间序列维度的特征对齐精度有关。
ResNext 在 UCI数据集上的分类性能通过标准化混淆矩阵可视化,矩阵行代表真实标签,列代表预测标签:
训练过程中,ResNext 的训练集与验证集指标表现如下:
训练损失在 50 个 epoch 内降至 0.05 以下,验证损失同步下降,最终稳定在 0.06 左右,表明模型收敛充分且泛化能力强。
ResNext 通过分组卷积与残差连接的结合,通过结构化设计,让模型在有限资源下实现更高效的特征学习,尤其在时序行为识别任务中展现出对结构化数据的强大建模能力,这一思想将继续启发后续的轻量化网络设计。实验结果表明,模型在简单动作上实现了接近完美的分类,对相似动作的区分能力也优于传统卷积架构。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。