ShuffleNet 学习笔记
一、ShuffleNet 概述
提出背景:
MobileNet 使用 Depthwise Separable Conv 减少计算量,但在实际移动端(如 ARM CPU)中仍存在计算瓶颈(尤其是 1×1 卷积耗时多)。
ShuffleNet 的目标是:
在保持精度的前提下,进一步降低计算成本与内存访问量,并提升在真实设备上的运行速度。
二、ShuffleNet v1
关键词:Group Convolution, Channel Shuffle(分组卷积,通道混洗)
1. 设计动机
- 1×1 卷积虽然参数少,但内存访问占比高。
- 分组卷积(Group Convolution)能减少计算,但组间通道信息被隔离,信息流不畅。
- 解决方案:引入通道混洗(Channel Shuffle)机制,打通不同组的特征流通。
2. 核心模块结构:Shuffle Unit
一个 Shuffle Unit 由以下部分组成:
- 1×1 Group Convolution(降维)
- 先用分组卷积减少计算量。
- Channel Shuffle(通道打乱)
- 将通道重新排列,使不同分组的信息可以交叉传播。
- 3×3 Depthwise Convolution(空间特征提取)
- 1×1 Group Convolution(升维)
- Shortcut 连接
- 当 stride = 1 时,使用残差连接;
- 当 stride = 2 时,使用 concat 拼接。
3. Channel Shuffle 原理详解
问题:
分组卷积会让特征图在通道维度上被割裂(每组信息独立),组间没有交互。
解决:
通道混洗步骤:
- 将特征图 reshape 成
(g, c/g, H, W)形式; - 在 group 维度上 transpose;
- 再 flatten 回原始通道顺序。
| 原始通道 | Group1 | Group2 |
|---|---|---|
| Input | [a1, a2, a3] | [b1, b2, b3] |
| Shuffle 后 | [a1, b1, a2, b2, a3, b3] | 组间通道交互 |
这样可以在不增加计算量的前提下,让不同组的信息流通。
4. 计算复杂度分析
与传统卷积相比,使用 Group Conv + Depthwise Conv + Shuffle 组合:
- 参数量减少至原来的约 1/4;
- Multiply-Adds 减少约 75%;
- 在移动端设备上推理速度提升显著。
5. 网络整体结构
| Stage | Output Size | Repeat | Out Channels | Notes |
|---|---|---|---|---|
| 1 | 112×112 | - | 24 | Conv3×3, stride=2 |
| 2 | 56×56 | 4 | 240 | Shuffle Unit ×4 |
| 3 | 28×28 | 8 | 480 | Shuffle Unit ×8 |
| 4 | 14×14 | 4 | 960 | Shuffle Unit ×4 |
| 5 | 7×7 | - | 1024 | Conv1×1 + Pool |
6. 实验结果
| 模型 | Top-1 准确率 | FLOPs (M) | 参数量 (M) |
|---|---|---|---|
| MobileNet v1 | 70.6 | 569 | 4.2 |
| ShuffleNet v1 (g=3) | 70.9 | 137 | 1.8 |
更快更轻量,几乎相同的精度。
三、ShuffleNet v2
关键词:实际部署优化、通道分裂、逐层融合
1. 设计动机
虽然 ShuffleNet v1 理论 FLOPs 低,但在真实硬件上仍存在:
- 内存访问开销高(MAC 不等于真实速度);
- 通道分组/拼接导致缓存效率低;
- 小通道数时,GPU 并行度低;
因此,作者通过大量实验,总结了 4 条实用准则:
2. 高效 CNN 设计四原则
| 原则 | 内容 | 解释 |
|---|---|---|
| ① 均衡通道宽度 | 同一层输入输出通道应相近 | 避免带宽瓶颈与缓存浪费 |
| ② 最小化碎片化操作 | 避免过多分支结构 | 多分支会降低并行效率 |
| ③ 减少元素级操作 | 比如 add / concat / shuffle | 这些操作不耗算力但耗时间 |
| ④ 注意内存访问成本(MAC) | 实测性能并非完全取决于 FLOPs | 要考虑数据读写与访存优化 |
3. ShuffleNet v2 Block 结构
核心模块:Channel Split + ShuffleNet v2 Unit
流程如下:
- Channel Split(通道分裂)
将输入特征图分成两部分:- 一部分直接 shortcut 连接;
- 另一部分进行卷积操作。
- 卷积分支:
- 1×1 Conv → BN → ReLU
- 3×3 DW Conv → BN
- 1×1 Conv → BN → ReLU
- Concat 拼接输出
- Channel Shuffle(再次混合)
优点:
- 无 group conv,避免组间信息受限;
- 无复杂分支,计算与访存更均衡;
- 实测速度显著提升。
4. Downsample Unit(步长为2的结构)
当 stride=2 时:
- 不使用 Channel Split;
- 使用两个分支:
- 主分支:普通卷积降采样;
- Shortcut 分支:DW Conv + 1×1 Conv;
- 最后 concat 拼接。
5. 网络结构
| Stage | Output Size | Repeat | Out Channels |
|---|---|---|---|
| 1 | 112×112 | - | 24 |
| 2 | 56×56 | 4 | 116 |
| 3 | 28×28 | 8 | 232 |
| 4 | 14×14 | 4 | 464 |
| 5 | 7×7 | - | 1024 |
6. 性能对比
| 模型 | FLOPs (M) | Params (M) | Top-1 (%) |
|---|---|---|---|
| ShuffleNet v1 (g=3) | 140 | 1.8 | 70.9 |
| ShuffleNet v2 (1.5×) | 299 | 3.5 | 72.6 |
| MobileNet v2 | 300 | 3.4 | 74.7 |
ShuffleNet v2 在相同复杂度下推理更快、延迟更低。
7. ShuffleNet v1 vs v2 总结对比
| 对比项 | ShuffleNet v1 | ShuffleNet v2 |
|---|---|---|
| 分组卷积 | 使用 group conv | 去除 group conv |
| 通道混洗 | 明确 Shuffle 操作 | 自然混合(split + concat) |
| 计算优化 | 理论 FLOPs 低 | 实测延迟更低 |
| 模块复杂度 | 稍高 | 更简洁、更硬件友好 |
| 精度速度权衡 | 精度略低但快 | 平衡更优 |
8. 总结
- ShuffleNet v1 的贡献在于: 用通道混洗创新解决了分组卷积的通道隔离问题。
- ShuffleNet v2 的贡献在于: 用结构化经验法则总结了轻量网络设计的本质原则,关注真实设备效率。
- 两者合起来,代表了从减少算力到优化访存的过渡阶段。