原论文:《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》
文中分析了模型的 FLOPS 与实际计算速度之间的差异:
-
以 FLOPS 为判定标注时,未考虑一些会影响速度的重要因素。
- 内存访问耗时(Memory Access Cost, MAC),该项因素在分组卷积耗时中占据了相当大份额;
- 并行化程度(Degree of Parallelism),在相同的 FLOPS 下,模型并行化程度越高,执行速度越快。
-
平台也会影响计算速度,这就使某些操作即便具有相同的 FLOPS,也会导致计算速度的不通。
- 张量分解常被用于加快矩阵乘法的计算速度,但是由于CUDNN计算库的问题,它在GPU上的速度可能会大大折扣。
基于上面的分析,在设计加速版模型时,文章中提出了两项原则:
- 直接使用计算速度等方式直接评估模型效果,而不是用FLOPS简介评估;
- 在目标平台上验证模型的速度等指标。
模型设计的四项原则
- 使 1 × 1 1 \times 1 1×1 Conv 的 输入输出通道数相同(可以保证MAC最小);
- 分组卷积可以在固定的 FLOPS 中提高通道的信息利用率,但 使用时要慎重,否则会增加 MAC;
- 尽量 减少模型分段的数量,以提高模型的并行化程度,进而发挥设备的并发优势;
- 尽量 减少元素级别的操作,防止低 FLOPS 高 MAC 现象的产生。
文章中对这四项原则有比较详细的分析,这里不再摘录,仅放一下作者等人所做的 实验结果。
ShuffleNet V2
v1
与 v2
对比:
仅介绍图中的 ( c ) (c) (c)
Channel Split
将输入特征的通道 c c c 分割为 c ′ c' c′ 与 c − c ′ c-c' c−c′(文章中使用 c ′ = c / 2 c'=c/2 c′=c/2)两个分支,其中一个分支与另一个经卷积处理的分支跳连,以构成 分组卷积 的形式,并且减少了 ReLU 与 深度卷积(Depth Convolution)等元素级别的操作;- 两个 1 × 1 1\times 1 1×1 Conv 的输入输出通道数相同;
- 使用拼接的方式 融合 两路分支的特征。
整体结构:
最后是实验,略