设想有一家叫 Shuffle 科技的研发公司。为了赶项目,老板把 12 名工程师按专业方向分成 3 个小组,每组 4 人,各占一间会议室,只看自己桌上的资料。组内沟通很快,可三个月后问题来了:三个组做出来的产品模块风格完全对不上,因为组与组之间从不交流。这种“分组干活、快而不通”的模式,就是卷积神经网络里的分组卷积——它把特征通道切成若干组,每组独立卷积,计算量降为原来的 1/g,却埋下了“信息孤岛”的隐患。Shuffle 科技的办法也很朴素:每周五下午,全体打乱座位重新坐——这就是通道混洗。座位变了,人没变、资料没变,但信息开始流动。这篇文章就用这场“跨组轮岗”,带你拆解分组卷积为何省钱、通道混洗如何零成本打通孤岛,以及 ShuffleNet v2 如何把这对黄金搭档打磨成移动端视觉模型的经典设计。

岗位关联

掌握分组卷积与通道混洗的协同原理,能帮你设计出既快又准的轻量 CNN,在手机端、嵌入式设备上做出真正能跑得动的视觉模型,是端侧算法工程师的核心基本功。

目录
  1. 可视化演示
  2. 一、分组卷积原理:把团队切成小组
  3. 二、通道混洗机制:一张转置的换座表
  4. 三、协同融合效果:轮岗带来的信息红利
  5. 四、ShuffleNet单元:把轮岗写进章程
  6. 五、网络整体架构:一条标准化的产线
  7. 六、性能优势分析:快,才是硬道理
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示ShuffleNet分组卷积的通道独立分组、通道混洗打破信息孤岛、以及ShuffleNet v2单元的完整数据流,理解轻量化CNN设计。

本节配有交互动效(进入视口后自动加载,约 3KB)。

分组卷积:通道独立分组 输入通道分为G组,各组独立卷积不交叉 计算量降为1/G,但组间信息无法流通 FLOPs = O(C²/G·K²) 分组卷积是ShuffleNet高效的基础

一、分组卷积原理:把团队切成小组

Shuffle 科技为了赶进度,把 12 名工程师分成 3 个小组,每组 4 人关进独立会议室,只准看自己桌上的资料。组内沟通成本低、决策快,但代价是组与组之间完全隔绝。在卷积网络里,这种“分组干活”就是分组卷积:把输入通道按组切开,每组只在自己的通道子集上做卷积运算,相当于每个工程师只看自己桌上的那叠图纸。

标准卷积中,每个输出通道都要与全部输入通道做运算,就像每个工程师要把全公司所有资料都看一遍,信息全面但开销巨大。分组卷积把输入通道切成 g 组,每组只处理 C_in/g 个输入通道、产生 C_out/g 个输出通道,最后拼回完整输出。这样做的直接收益是:计算量和参数量双双降到原来的 1/g。

FLOPs标准=H×W×Cin×Cout×k2,FLOPs分组=H×W×Cin×Cout×k2g\displaystyle \text{FLOPs}_{\text{标准}} = H \times W \times C_{\text{in}} \times C_{\text{out}} \times k^{2}, \qquad \text{FLOPs}_{\text{分组}} = \frac{H \times W \times C_{\text{in}} \times C_{\text{out}} \times k^{2}}{g}

1. H × W:输出特征图上每个空间位置都要执行一次卷积窗口计算,所以先乘上特征图的长宽。

H×WH \times W

2. C_in × k²:每个输出位置要读取 C_in 个输入通道的 k×k 邻域像素,这是卷积核的覆盖范围。

Cin×k2C_{\text{in}} \times k^{2}

3. × C_out:每个输出通道都独立重复一遍上述过程,所以要再乘输出通道数。

×  Cout\times \; C_{\text{out}}

4. ÷ g:分组后每组只负责 1/g 的输入输出通道,总乘加次数随之除以 g——这就是省算力的来源。

÷  g\div \; g

分组卷积省下了真金白银的算力,却也埋下了一颗雷:第一组永远只见过通道 0 到 C/g 的特征,学到的知识“偏科”。三个月后老板发现,三个组做出来的产品模块风格完全对不上——这就是信息孤岛:组与组之间的特征从不交流,模型表达能力被悄悄削弱。

二、通道混洗机制:一张转置的换座表

老板的解决办法是一场“换座周”:每周五下午,12 名工程师打乱座位重新坐,每个会议室里都混入其他组的人。人还是那 12 个人,资料还是那些资料,但信息开始流动。ShuffleNet 里对应的操作就叫通道混洗,它的本质就是一次“打乱座位”——而且成本几乎为零。

通道混洗不引入任何参数,也不做任何乘加运算,只是把通道的顺序重新排列一遍。具体做法是把 C 个通道先排成 g 行、每行 C/g 列(reshape),然后交换行列(transpose),最后展开回一维(flatten)。以 12 个通道分 3 组为例:混洗前是 [组0 的4个通道、组1 的4个通道、组2 的4个通道];混洗后变成每组各取一个、轮流穿插的序列,相当于把 3×4 的矩阵转置成 4×3 再展开。

X′=flatten(transpose(reshape(X, [ g,  C/g,  H,  W ])))\displaystyle \mathbf{X}' = \text{flatten}\left(\text{transpose}\left(\text{reshape}\left(\mathbf{X},\,[\,g,\;C/g,\;H,\;W\,]\right)\right)\right)

1. reshape:把形状为 C 的通道维拆成 (g, C/g) 两维,g 是组数,C/g 是每组通道数。

reshape(X, [ g,  C/g,  H,  W ])\text{reshape}(\mathbf{X},\,[\,g,\;C/g,\;H,\;W\,])

2. transpose:交换“组”这一维和“组内通道”这一维,矩阵的行列互换,这是换座的核心。

transpose(⋅, (组维↔组内维))\text{transpose}(\cdot,\,(\text{组维} \leftrightarrow \text{组内维}))

3. flatten:把交换后的两维重新展平成 C 维,得到混洗后的特征图,可以喂给下一层分组卷积。

X′=flatten(⋅)\mathbf{X}' = \text{flatten}(\cdot)

通道混洗看起来只是一个索引重排,却是整个 ShuffleNet 的灵魂:它像是会议室的布局被重新画了一张表,转置这个动作让原本只属于某一组的信息,被“借”到了其他组的视角里。而这一切没有增加一个 FLOP。

三、协同融合效果:轮岗带来的信息红利

换座制推行一个月后,效果立竿见影:每个会议室里都坐着来自不同原小组的人,大家互相交换各自项目踩过的坑,产品风格逐渐统一。通道混洗的妙处也在这里——混洗之后,下一层分组卷积的任何一个“新组”,都能读到所有旧组的通道。

为什么这能打破信息孤岛?关键在于分组卷积的“再看一次”。第一次分组卷积后,各组的特征是隔离的;混洗把这些特征重新均匀分配到各个组;第二次分组卷积时,每个组输入的通道已经来自全部旧组,特征得以跨组融合。如果把这个保证写成数学语言,就是:混洗后,任意一个输出组与任意一个输入组之间都有通道交集。

∀j∈{0,1,…,g−1},  ∀i∈{0,1,…,g−1}:Groupjout∩Groupiin≠∅\displaystyle \forall j \in \{0,1,\dots,g-1\},\; \forall i \in \{0,1,\dots,g-1\}: \quad \text{Group}_{j}^{\text{out}} \cap \text{Group}_{i}^{\text{in}} \neq \varnothing

1. ∀j 和 ∀i:遍历所有输出组 j 和所有输入组 i,要求每对组合都满足后面的条件。

∀j,  ∀i\forall j,\; \forall i

2. Group_j^out ∩ Group_i^in:取输出组 j 的通道集合与输入组 i 的通道集合的交集。

Groupjout∩Groupiin\text{Group}_{j}^{\text{out}} \cap \text{Group}_{i}^{\text{in}}

3. ≠ ∅:交集不为空,说明每个输出组都真实包含了每个输入组的通道,信息实现了全连通。

≠∅\neq \varnothing

这个“信息红利”在分组数 g 越大时越明显:分组越多,信息孤岛越深,混洗带来的收益就越大。ShuffleNet v1 论文中的实验显示,当分组数达到 8 时,去掉混洗的网络精度会明显下滑,而加上混洗后精度能回升数个百分点,几乎追平不分组模型。一次零成本的座位重排,胜过无数次组内加班。

四、ShuffleNet单元:把轮岗写进章程

换座制度效果很好,老板决定把它写进《协作章程》,变成每个项目的标准动作。ShuffleNet 也做了同样的事:把“分组卷积 + 通道混洗”封装成可重复堆叠的基础单元,让每个模块都自动完成“分组干活 → 换座交流”的循环。

v1 的基本单元是一个带残差连接的瓶颈块:先用 1×1 分组卷积压缩通道,再接 3×3 深度可分离卷积提取空间特征,再用 1×1 分组卷积恢复通道;两个分组卷积之间插入通道混洗,残差短路连接则在最后把输入与输出相加。到了 v2,设计更进一步:用通道分割替代了主干上的大分组卷积——输入通道一分为二,一半走恒等分支原地待命,另一半走“1×1 → 3×3 深度可分离 → 1×1”的变换分支,最后 concat 合并再混洗。

z=shuffle(concat(x1,  F(x2))),F=Conv1×1∘DWConv3×3∘Conv1×1\displaystyle \mathbf{z} = \text{shuffle}\left(\text{concat}\left(\mathbf{x}_{1},\;\mathcal{F}(\mathbf{x}_{2})\right)\right), \qquad \mathcal{F} = \text{Conv}_{1\times1} \circ \text{DWConv}_{3\times3} \circ \text{Conv}_{1\times1}

1. x = [x₁, x₂]:通道分割把输入沿通道维切成两份,x₁ 是恒等分支,x₂ 是变换分支。

x=[ x1,  x2 ]\mathbf{x} = [\,\mathbf{x}_{1},\; \mathbf{x}_{2}\,]

2. F(x₂):变换分支依次经过 1×1 卷积、3×3 深度可分离卷积、1×1 卷积,负责真正“干活”。

F(x2)\mathcal{F}(\mathbf{x}_{2})

3. concat:把恒等分支和变换分支的输出沿通道维拼接起来,两路信息合流。

concat(x1,  F(x2))\text{concat}(\mathbf{x}_{1},\;\mathcal{F}(\mathbf{x}_{2}))

4. shuffle:concat 之后立即通道混洗,防止两分支再次形成新的信息孤岛。

z=shuffle(⋅)\mathbf{z} = \text{shuffle}(\cdot)

v2 的这个设计非常聪明:先留一半人原地待命,让另一半人专心干活,工作量直接减半;最后合流再混座,又保证了全组信息互通。残差短路连接则像“老带新”制度——即使变换分支学坏了,恒等分支也能把原始信息稳稳地带到输出端。

五、网络整体架构:一条标准化的产线

章程定好了,接下来就是把标准单元组装成整条产线。Shuffle 科技的生产线分几个核心车间,每个车间里反复执行同一套标准动作,车间之间通过“淘汰换班”来控制规模。ShuffleNet 的网络结构正是这样组织的。

整体架构分为五段:第一段是 3×3 标准卷积加最大池化,相当于入场安检,先把 224×224 的输入图像快速降采样;中间是三个核心阶段 Stage2/3/4,每个阶段由若干 ShuffleNet 单元堆叠而成,阶段之间用 stride=2 的下采样单元过渡——下采样单元不做通道分割,两个分支都做变换,concat 后通道数翻倍,分辨率减半;最后接全局平均池化和分类层。

每个阶段的通道数由“宽度倍率”统一调节,分组数 g 则控制信息流通的粒度,常见配置如下:

| 宽度倍率 | 首层通道 | Stage2 输出 | Stage3 输出 | Stage4 输出 |

|---|---|---|---|---|

| 0.5x | 24 | 48 | 96 | 192 |

| 1.0x | 24 | 116 | 232 | 464 |

| 1.5x | 24 | 176 | 352 | 704 |

| 2.0x | 24 | 244 | 488 | 976 |

分组数 g 通常在 2、3、4、8 之间选择。值得注意的是,v2 论文有一条重要提醒:分组越多,通道被切得越碎,实际运行时内存访问代价越高,所以 v2 在单元内部干脆用通道分割替代了大分组卷积,把分组数控制在更克制的范围。整条产线从“输入一张图”到“输出分类分数”,每一步都是章程里的标准动作,结构规整、便于硬件加速。

六、性能优势分析:快,才是硬道理

流水线搭好后,该用成绩说话了。ShuffleNet 团队在 ImageNet 上做了大量对比实验,结果很有说服力:在相同精度下,ShuffleNet v2 在 ARM 设备上的实际推理速度比 MobileNet v2 快约 58%;在相同 FLOPs 下,它的精度也高于多数同期轻量网络。为什么“看起来更省”的 MobileNet 反而跑得慢?

答案藏在内存访问成本里。FLOPs 只统计乘加运算次数,但神经网络在真实硬件上还要反复读写内存。对于一个输入输出通道分别为 c₁、c₂ 的 1×1 卷积层,一次前向传播的内存访问量约等于:

MAC=hw(c1+c2)+c1c2hwg\displaystyle MAC = hw(c_{1} + c_{2}) + \frac{c_{1}c_{2}hw}{g}

1. hw(c₁ + c₂):特征图每个位置都要读一次输入、写一次输出,总访问量与通道数成正比。

hw(c1+c2)hw(c_{1} + c_{2})

2. c₁c₂hw / g:读取权重矩阵的内存开销,分组后权重变小,这一项确实会下降。

c1c2hwg\frac{c_{1}c_{2}hw}{g}

3. g 增大的两难:权重项减小,但碎片化计算加重、缓存命中率下降,总延迟未必降低——所以分组数不是越大越好。

g↑⇒MAC 未必↓g \uparrow \Rightarrow \text{MAC 未必} \downarrow

基于此,ShuffleNet v2 总结出四条设计准则:均衡各分支通道宽度,让计算密度最大化;避免过多分组卷积,减少碎片化;减少网络碎片结构,提升并行度;减少逐元素操作(如 ReLU、加法的数量),因为这类操作同样消耗时间。这套准则让它真正成为移动端落地的利器——模型小、速度快、结构规整,非常适合在手机 CPU、嵌入式设备的端侧做实时推理。

AI 应用场景

场景一:手机相册智能分类

阶段:模型部署与推理优化

解决的问题:传统 ResNet 等大模型参数动辄上百 MB,手机 CPU/GPU 跑不动、发热严重,用户拍照后分类结果要等半天。ShuffleNet 用分组卷积加通道混洗把 FLOPs 压到千万级,同时通过 v2 设计准则优化内存访问,让模型在移动端也能实时运行。

具体案例:某手机厂商相册的“智能分类”功能把主干从 ResNet-18 换成 ShuffleNet v2 1x 后,端侧单张推理时间从 120ms 降到 45ms,机身发热明显缓解,分类精度仍保持在 90% 以上,用户几乎无感知等待。

场景二:嵌入式安防人形检测

阶段:模型选型与轻量化改造

解决的问题:门禁、监控摄像头的算力芯片功耗只有几瓦,内存不足 1GB,跑不动标准卷积网络。ShuffleNet 结构规整、无碎片化,天然适配低算力硬件的并行计算,通道混洗又保证了轻量化后的特征表达能力。

具体案例:某智能门禁设备将检测模型的主干换成 ShuffleNet,搭配轻量检测头,在 2W 功耗的嵌入式芯片上跑到了 30FPS,实现了深夜低照度下的人形实时检测,误报率比此前使用的裁剪版 MobileNet 更低。

场景三:自动驾驶泊车感知

阶段:多任务模型设计

解决的问题:低速泊车场景需要同时做语义分割、障碍物检测等多个任务,共享主干必须又快又准。ShuffleNet 的通道混洗机制让轻量主干依然保有跨组特征融合能力,适合作为多任务模型的公共底座。

具体案例:某自动驾驶方案在记忆泊车功能中,用 ShuffleNet v2 作为语义分割主干,配合轻量解码头,在车规级芯片上同时跑分割与检测两个任务,整体延迟控制在 20ms 内,兼顾了实时性与安全性。

Python 演示

python48 行
import numpy as np  def grouped_linear(x, weight, groups):    """分组线性变换:模拟分组卷积在单个空间位置上的计算.     每个组只用自己的输入通道与输出通道做矩阵乘,    相当于把一个大矩阵换成 groups 个小块对角矩阵.    """    C = x.shape[1]    Cg = C // groups    out = np.zeros_like(x, dtype=float)    for k in range(groups):        sl = slice(k * Cg, (k + 1) * Cg)        out[:, sl] = x[:, sl] @ weight[sl, sl]    return out  def channel_shuffle(x, groups):    """通道混洗:reshape -> transpose -> flatten,零参数重排通道."""    C = x.shape[1]    Cg = C // groups    x = x.reshape(-1, groups, Cg)    x = np.transpose(x, (0, 2, 1))    return x.reshape(-1, C)  def flops_compare(C_in, C_out, groups):    """对比标准卷积与分组卷积的单点计算量."""    full = C_in * C_out    group = (C_in // groups) * (C_out // groups) * groups    return full, group  if __name__ == "__main__":    np.random.seed(0)    x = np.array([[1, 2, 3, 4, 5, 6, 7, 8],                  [8, 7, 6, 5, 4, 3, 2, 1]], dtype=float)    w = np.arange(64, dtype=float).reshape(8, 8) * 0.1    y = grouped_linear(x, w, 2)    print("分组卷积输出形状:", y.shape)     x_mix = channel_shuffle(x, 2)    print("混洗前第一组通道:", x[0, :4].tolist())    print("混洗后前四个通道:", x_mix[0, :4].tolist())     full, group = flops_compare(128, 128, 4)    print("标准计算量:", full, "分组计算量:", group)
目的:用 NumPy 从零模拟“分组卷积 + 通道混洗”的核心运算,直观对比二者在计算量与信息流通上的差异。
  1. out[:, sl] = x[:, sl] @ weight[sl, sl]每个组只在通道子块上做矩阵乘,这就是分组卷积“组内干活”的本质。
  2. sl = slice(k * Cg, (k + 1) * Cg)按组号切出对应的通道区间,把输入通道切成 g 段。
  3. full = C_in * C_out标准卷积单点计算量:每个输出都要乘遍所有输入。
  4. group = (C_in // groups) * (C_out // groups) * groups分组后总计算量约下降 g 倍。
  5. x = x.reshape(-1, groups, Cg)把通道维拆成“组数 × 每组通道数”两维,对应换座前的会议室矩阵。
  6. x = np.transpose(x, (0, 2, 1))交换组维与组内通道维,矩阵转置,座位开始打乱。
  7. x = x.reshape(-1, C)展平回原通道数,换座完成,数值一个没丢。
  8. x_mix[0, :4]混洗后前 4 个通道同时包含原第 1 组和第 2 组的元素,信息孤岛被打通。

常见误区

误区我以为分组卷积就是把计算量除以 g 的免费午餐,把分组数调大,模型又快又准,怎么可能有副作用?

正解分组卷积把输入通道切块,每组只能看到自己那 1/g 的特征,组间信息完全隔离。就像三个小组各做各的从不碰头,产品风格必然跑偏。g 越大隔离越严重,精度会明显下滑。必须搭配通道混洗把信息重新打散流通,才能把省下的算力真正变成收益。

为何常见:因为分组卷积确实把计算量除以了 g,省算力的效果太直观,容易让人忽略它同时砍断了组间的信息通路。

误区我觉得混洗把通道顺序打乱了,模型应该会丢掉一些信息,精度反而下降,这个操作有点危险。

正解混洗只是把通道的位置重新排列,每个数值原封不动,信息量守恒。它没有参数也没有乘法,纯粹是索引级的重排。打乱的是“座位”,不是“人”。下一层卷积照样能读到全部特征,而且因为分组的存在,跨组信息第一次得以融合。

为何常见:直觉上“打乱”等于“破坏”,但在计算机里重排索引是零损耗操作,和丢数据完全是两码事。

误区我看到 v2 单元用的是通道分割和深度可分离卷积,觉得混洗已经被淘汰,不再重要了。

正解v2 确实不再用 v1 那种大分组卷积,但每个单元 concat 之后仍然紧跟一个通道混洗。通道分割制造了两个分支,concat 后如果不混洗,两分支的信息依旧各走各的路,等于又形成新的孤岛。混洗在 v2 里不是被删除,而是从“分组卷积的补救”升级成“双分支融合的标配”。

为何常见:只看到结构图里 Channel Shuffle 画在末尾、没引起注意,就误以为它可有可无。

误区分组卷积把 FLOPs 降了 1/g,那我把 g 设为 8、16,模型不是更快?分组数应该越大越好吧。

正解FLOPs 只是理论乘法次数,实际速度还受内存访问成本制约。分组越多,通道被切得越碎,每组的权重和特征都要单独搬运,MAC 反而上升;碎片化也不利于并行计算。v2 的准则之一是“避免过多分组卷积”,分组数在 2~8 之间权衡,不是越大越好。

为何常见:只看 FLOPs 单一指标而忽略内存访问和并行度,是初学者最容易踩的坑,也正因如此 v2 才强调用实际延迟来衡量模型。

面试题

Q1. 分组卷积最主要解决的问题是?

单选题 · easy

  • A.提升模型精度的上限
  • B.提高特征图的分辨率
  • C.降低计算量与参数量← 正确答案
  • D.消除训练中的过拟合

答案:C。分组卷积把输入通道切成 g 组,每组只在自己那块通道上做卷积,计算量和参数量都近似除以 g。它并不直接提升精度上限,也跟分辨率、过拟合无关。就像小组分工能节省沟通成本,但不会自动让产品更好。

Q2. 通道混洗的核心操作顺序是?

单选题 · easy

  • A.展平、转置、重塑
  • B.重塑、展平、转置
  • C.重塑、转置、展平← 正确答案
  • D.转置、重塑、展平

答案:C。通道混洗的正确顺序是 reshape → transpose → flatten:先把通道维拆成 (g, C/g) 的矩阵,再交换组维和组内通道维,最后展平回原形状。A、D 把 reshape 和 flatten 的位置搞反,B 先展平就无法再做转置了。

Q3. 输入 8 个通道、分 2 组做混洗,原第 3 个通道混洗后的新位置是?

单选题 · mid

  • A.第 2 个位置
  • B.第 3 个位置
  • C.第 7 个位置
  • D.第 5 个位置← 正确答案

答案:D。C=8、g=2,每组 Cg=4。原第 3 个通道对应下标 i=2,新位置 j=(i mod 4)×2 + floor(i/2) = 4,即混洗后序列 [0,4,1,5,2,6,3,7] 中的第 5 个位置。混洗的数学本质就是矩阵转置后展平。

Q4. 关于通道混洗,下列说法正确的有?

多选题 · mid

  • A.会引入可学习的参数
  • B.只重排不改变数值← 正确答案
  • C.能促进组间信息流通← 正确答案
  • D.会显著增加计算开销

答案:BC。通道混洗只是索引重排,不引入任何参数、不改变通道数值、不增加计算量,因此 A、D 错误。它让下一层分组卷积能读到其他组的通道,从而打破信息孤岛、促进组间流通,这正是 ShuffleNet 的核心设计。

Q5. ShuffleNet v2 基本单元中用通道分割替代了哪种结构?

单选题 · mid

  • A.全局平均池化层
  • B.分组卷积层结构← 正确答案
  • C.批归一化处理
  • D.残差短路连接

答案:B。v2 为了减少碎片化、降低内存访问成本,不再在主干分支上用大分组卷积,而是把输入一分为二(通道分割):一半恒等、一半走 1×1→3×3 深度可分离→1×1,最后 concat 再混洗。池化、归一化、残差结构都仍然保留。

Q6. ShuffleNet v2 的四条设计准则包括?

多选题 · hard

  • A.均衡各分支通道宽度← 正确答案
  • B.使用越多分组卷积越好
  • C.尽量减少网络碎片化← 正确答案
  • D.减少逐元素操作数量← 正确答案

答案:ACD。v2 的四条准则是:均衡通道宽度、避免过多分组卷积、减少碎片化、减少逐元素操作。B 说反了——分组越多 MAC 越大、并行度越低,所以 v2 强调“避免过多分组卷积”而非“越多越好”。

Q7. “信息孤岛”在分组卷积中指的是什么?

单选题 · mid

  • A.梯度完全无法反传
  • B.不同组特征互不融合← 正确答案
  • C.输出通道维度过低
  • D.网络结构过于碎片化

答案:B。分组卷积的每组只看自己 1/g 的通道,不同组的特征在深层网络里永远无法融合,就像三个会议室互不通气。这说的是信息流通问题,与梯度传播、通道维度、碎片化不是一回事。

Q8. 关于内存访问成本对推理速度的影响,正确的是?

单选题 · extreme

  • A.FLOPs 相同则速度必定相同
  • B.分组越多内存访问越少
  • C.内存访问成本与分组无关
  • D.过多分组会增大内存访问成本← 正确答案

答案:D。FLOPs 只是理论乘法次数,实际速度还受内存访问成本制约。分组越多,每组的权重和特征都要单独搬运,计算碎片化、缓存命中率下降,MAC 反而上升,因此“FLOPs 相同速度必相同”是错的,分组数也需要权衡。

Q9. ShuffleNet 适合移动端部署的原因有?

多选题 · easy

  • A.计算量参数量更低← 正确答案
  • B.端侧实际推理更快← 正确答案
  • C.依赖云端重型服务器
  • D.结构利于端侧部署← 正确答案

答案:ABD。ShuffleNet 计算量小、结构规整、无碎片化,在手机 CPU/GPU 上实测延迟低,非常适合端侧部署,不需要云端重型服务器。C 说反了——轻量化的目的恰恰是摆脱对云端的依赖。

Q10. ShuffleNet v2 的下采样单元与基本单元最大的区别是?

单选题 · hard

  • A.输入不分割两分支都变换← 正确答案
  • B.下采样单元不做残差
  • C.下采样单元删除混洗
  • D.下采样单元去掉卷积

答案:A。下采样单元 stride=2,如果还做通道分割会丢失信息,所以输入不分割、两个分支都做变换,concat 后通道数翻倍、分辨率减半。残差连接、卷积、通道混洗在这些单元中全都保留,只是分流策略不同。