前言
前面给大家讲解了MobileNetv1,v2,v3版本,今天给大家带来由Megvii(旷视科技,Face++)2018年发表在CVPR 上的ShuffleNet 论文精读,ShuffleNet V1 主要解决的问题是:1. 提升移动端 CNN 的计算效率,在计算资源有限的情况下保持较高的分类准确率。2. 优化分组卷积的缺点,让不同通道的信息能有效混合。
主要的创新点: 提出 ShuffleNet 结构:Group Convolution(分组卷积)+Channel Shuffle(通道混洗)
那么我们来一起看一下吧
论文地址:https://arxiv.org/pdf/1707.01083
论文讲解+代码讲解:B站 智算学术
领取100G深度学习资料,500多篇经典论文,论文辅导等请关注作者公众号: 智算学术 回复:资料 领取
前景回顾
LeNet 论文精读 | 深度解析+PyTorch代码复现(上)_yann lecun卷积网络的奠定文章-优快云博客
LeNet 论文精读 | 深度解析+PyTorch代码复现(下)_lenet搭建与mnist训练-优快云博客
AlexNet 论文精读 | 深度解析+PyTorch代码复现 (上)-优快云博客
AlexNet 论文精读 | 深度解析+PyTorch代码复现 (下)-优快云博客
VGG论文精读 | 翻译+学习笔记+PyTorch代码复现_vgg数据增强-优快云博客
GoogleNet论文精读 | 翻译+学习笔记+PyTorch代码复现-优快云博客
ResNet论文精读:翻译+学习笔记+Pytorch代码复现-优快云博客
MobileNetV1论文精读(八):翻译+学习笔记+pytorch代码复现
MobileNetV2论文精读(九):翻译+学习笔记+pytorch代码复现-优快云博客
MobileNetV3论文精读(十):翻译+学习笔记+pytorch代码复现-优快云博客
3.1 Channel Shuffle for Group Convolutions—用于分组卷积的通道重排
3.2 ShuffleNet Unit—ShuffleNet单元
3.3 Network Architecture—网络体系结构
4.1.1 Pointwise Group Convolutions—分组逐点卷积
4.1.2 Channel Shuffle vs. No Shuffe—通道重排 vs 不重排
4.2 Comparison with Other Structure Units—与其他结构单元比较
4.3 Comparison with MobileNets and Other Frameworks—与MobileNets和其他框架进行比较
4.4 Generalization Ability—泛化能力
4.5 Actual Speedup Evaluation—实际加速评估
Abstract—摘要
翻译
我们提出了一种极其计算高效的 CNN 结构,名为 ShuffleNet,专为计算能力极其有限的移动设备(例如 10-150 MFLOPs)设计。该新架构引入了两种新的操作:逐点分组卷积(pointwise group convolution)和通道混洗(channel shuffle),在大幅降低计算成本的同时,仍能保持较高的准确率。
在 ImageNet 图像分类和 MS COCO 目标检测任务上的实验表明,ShuffleNet 相较于其他网络结构具有更优性能。例如,在计算预算为 40 MFLOPs 的情况下,ShuffleNet 的 top-1 错误率比最新的 MobileNet 低 7.8%(绝对值)。在一款基于 ARM 处理器的移动设备上,ShuffleNet 的实际推理速度相比 AlexNet 提高了约 13 倍,同时保持了相近的准确率。
精读
主要工作
-
提出了一种高效的 CNN 结构 ShuffleNet,专为计算能力受限的移动设备设计(计算预算 10-150 MFLOPs)。
-
引入两种关键技术:逐点分组卷积(pointwise group convolution)和通道混洗(channel shuffle),在降低计算量的同时保持高准确率。
-
在 ImageNet 分类和 MS COCO 目标检测任务上进行实验,结果显示 ShuffleNet 在计算预算 40 MFLOPs 时,比 MobileNet 低 7.8% 的 top-1 误差。
-
在 ARM 设备上测试了实际推理速度,ShuffleNet 比 AlexNet 加速约 13 倍,同时保持类似的分类准确率。
一、Introduction—简介
翻译
构建更深、更大的卷积神经网络(CNN)是解决主要视觉识别任务的主要趋势。这些最先进的 CNN 通常包含数百层和数千个通道,因此计算量可达数十亿 FLOPs。
本研究探讨了完全相反的方向:在计算预算极其有限的情况下(仅为几十到几百 MFLOPs),追求最佳的准确率,重点关注无人机、机器人和智能手机等常见的移动平台。需要注意的是,许多现有研究主要致力于对“基础”网络架构进行剪枝、压缩或低比特量化,而本研究的目标是探索一种专门为低计算预算设计的高效基础架构。
我们注意到,像 Xception 和 ResNeXt 这样的先进基础架构在极小的网络中变得不够高效,主要原因是 1×1 卷积的计算代价过高。为此,我们提出使用逐点分组卷积(pointwise group convolution)来降低 1×1 卷积的计算复杂度。与此同时,分组卷积会限制特征信息在通道之间的流动,为了克服这一副作用,我们设计了一种通道混洗(channel shuffle)操作,使特征通道之间的信息能够充分交互。
基于这两项技术,我们构建了一种高效的 CNN 结构,称为 ShuffleNet。与其他流行架构相比,在相同的计算预算下,ShuffleNet 能够使用更多的特征通道,这有助于编码更多信息,尤其对极小型网络的性能至关重要。
我们在 ImageNet 图像分类和 MS COCO 目标检测任务上对模型进行了评估。一系列对比实验表明,我们的设计原则具有有效性,并且性能优于其他网络结构。例如,与最新的 MobileNet 相比,在 40 MFLOPs 的计算预算下,ShuffleNet 的 ImageNet top-1 误差低 7.8%(绝对值),实现了显著的性能提升。此外,我们还在实际硬件上测试了加速效果,即在一款现成的基于 ARM 的计算核心上进行测试。结果表明,ShuffleNet 在保持相近准确率的情况下,相比 AlexNet 实现了约 13 倍的实际加速(理论加速可达 18 倍)。
精读
研究背景:
-
深度 CNN 计算量大,不适用于移动设备。
-
Xception、ResNeXt 等网络在小型 CNN 中因 1×1 卷积计算代价高,效率下降。
-
目标:在极低计算预算(几十到几百 MFLOPs)下设计高效 CNN。
核心贡献:
-
提出 ShuffleNet,优化小型 CNN 的计算效率。
-
引入 逐点分组卷积 降低 1×1 计算量,通道混洗 解决信息流受限问题。
二、Related Work—相关工作
Efficient Model Designs—高效模型设计
翻译
高效模型设计 近年来,深度神经网络在计算机视觉任务中取得了巨大成功,模型设计在其中起到了重要作用。随着对嵌入式设备上高质量深度神经网络需求的增加,研究者们开始探索高效的模型设计。例如,GoogLeNet 通过增加网络深度而非简单堆叠卷积层来降低计算复杂度;SqueezeNet 在保持准确率的同时显著减少了参数量和计算量;ResNet 采用高效的瓶颈结构,实现了卓越的性能;SENet 引入了一种新的架构单元,在仅增加少量计算成本的情况下提升了性能。此外,一项与本研究同时进行的最新工作采用强化学习和模型搜索来探索高效模型设计,其提出的 Mobile NASNet 模型在 ImageNet 分类任务上的表现与 ShuffleNet 相当(26.0% @ 564 MFLOPs vs. 26.3% @ 524 MFLOPs)。但该工作未在极小型模型(计算复杂度低于 150 MFLOPs)上进行实验,也未评估模型在移动设备上的实际推理时间。
分组卷积 分组卷积最早由 AlexNet 提出,用于在两个 GPU 之间分配模型,并在 ResNeXt 中进一步证明了其有效性。Xception 提出的深度可分离卷积是对 Inception 系列中可分离卷积的推广。最近,MobileNet 采用深度可分离卷积,在轻量级模型中取得了最先进的结果。本文在此基础上对分组卷积和深度可分离卷积进行了一种新的泛化。
通道混洗操作 据我们所知,通道混洗的概念在以往的高效模型设计中几乎未被提及,尽管 CNN 库 cuda-convnet 提供了一种“随机稀疏卷积”层,该层相当于在分组卷积之前进行随机通道混洗。然而,这种“随机混洗”操作的目的不同,并未被广泛应用。最近另一项同时进行的研究也采用了类似的想法,用于两阶段卷积,但未专门研究通道混洗的有效性及其在小型模型中的应用。
模型加速 该方向旨在在保持模型准确率的同时加速推理。剪枝方法通过减少预训练模型中的冗余连接或通道来保持性能的同时减少计算量。量化和因式分解方法被用于降低计算冗余,以加速推理。除了修改模型参数外,基于 FFT 的优化卷积算法以及其他方法在实践中减少了推理时间。此外,知识蒸馏通过将大模型的知识迁移到小模型中,使得小模型的训练更加容易。
精读
高效模型设计:回顾了以前的网络的设计思路,并总结了优缺点
分组卷积:最早由AlexNet提出,后面Xception ,MobileNet 分别继承分组卷积的思路,本论文中设计也对分组卷积进行了改进
通道混洗操作:cuda-convnet 提供了一种“随机稀疏卷积”层,该层相当于在分组卷积之前进行随机通道混洗,但是未专门研究通道混洗的有效性及其在小型模型中的应用。
模型加速:方法有剪枝,量化和因式分解,优化卷积算法,知识蒸馏
三、Approach—方法
3.1 Channel Shuffle for Group Convolutions—用于分组卷积的通道重排
翻译
现代卷积神经网络通常由具有相同结构的重复构建块组成。在这些网络中,像 Xception 和 ResNeXt 这样的先进网络将高效的深度可分离卷积或分组卷积引入构建块中,以在表达能力和计算成本之间取得良好的平衡。然而,我们注意到这两种设计没有充分考虑 1 × 1 卷积(在一些文献中也叫做点卷积),而 1 × 1 卷积需要相当大的计算复杂度。例如,在 ResNeXt 中,只有 3 × 3 层配备了分组卷积。因此,在 ResNeXt 的每个残差单元中,点卷积占据了 93.4% 的乘加运算(当卡尔曼度为 32 时,按照 ResNeXt 的建议)。在小型网络中,昂贵的点卷积导致了受计算复杂度限制的通道数,从而可能显著降低准确性。
为了解决这个问题,一种简单的解决方案是对 1 × 1 层应用通道稀疏连接,例如在 1 × 1 层上也使用分组卷积。通过确保每个卷积仅作用于对应的输入通道组,分组卷积显著减少了计算成本。然而,如果多个分组卷积层堆叠在一起,就会有一个副作用:某一通道的输出仅由少部分输入通道产生。如图 1(a)所示,堆叠的两个分组卷积层中,某个组的输出仅与组内的输入相关。这种特性阻止了不同通道组之间的信息流动,从而削弱了表示能力。如果我们允许分组卷积从不同的组获取输入(如图 1(b)所示),那么输入和输出通道将完全相关。具体来说,对于由前一个分组层生成的特征图,我们可以先将每组通道分成多个子组,然后将每个子组传递到下一个层。这可以通过通道混洗操作(如图 1(c)所示)高效且优雅地实现:假设一个具有 g 个组的卷积层,其输出具有 g × n 个通道;我们首先将输出的通道维度重塑为(g,n),然后进行转置并将其展平,作为下一层的输入。需要注意的是,即使两个卷积层具有不同的组数,这个操作仍然有效。此外,通道混洗也是可微的,这意味着它可以嵌入到网络结构中进行端到端的训练。
通道混洗操作使得能够构建具有多个分组卷积层的更强大的结构。在下一小节中,我们将介绍一种包含通道混洗和分组卷积的高效网络单元。
精读
主要内容
前人工作遇到的的问题:
1×1 卷积在残差单元中占比 93.4% 乘法运算,需要优化这部分的计算
前人解决的方法:
resNext提出组卷积,MobileNet 提出深度可分离卷积网络,都是采用分组卷积思想,但是 、每个输出通道仅与组内的输入通道相关,没有交叉信息,如图a
本论文的解决方法:
b) 当 GConv2 从 GConv1 之后的不同组获取数据时,输入和输出通道完全相关,图中,第一个分组卷积分为3个大分组,然后在把每个大分组分为3个小分组,从每个大分组里面各自拿出一个小分组,组成一个新的大分组,生成第二个分组卷积(其实就是洗牌操作)
c) 使用通道混洗实现与 b) 相同的效果。 channel shuffle 通道重排的过程
3.2 ShuffleNet Unit—ShuffleNet单元
翻译
利用通道混洗(channel shuffle)操作,我们提出了一种专为小型网络设计的新型 ShuffleNet 单元。我们从瓶颈单元(bottleneck unit)的设计原则出发,如图 2(a) 所示。
该结构是一个残差块(residual block)。在其残差分支中,对于 3 × 3 层,我们在瓶颈特征图上应用计算高效的 3 × 3 深度可分离卷积(depthwise convolution)。然后,我们用点卷积(1 × 1)分组卷积(pointwise group convolution)替换原始的 1 × 1 卷积层,并在其后添加通道混洗操作,从而形成 ShuffleNet 单元,如图 2(b) 所示。
第二个点卷积分组卷积的作用是恢复通道数,以匹配跳跃连接(shortcut path)。为了简化设计,我们没有在第二个点卷积层后额外添加通道混洗操作,因为实验表明其性能相当。
在 ShuffleNet 需要步长(stride)时,我们进行了两处修改(见图 2(c)): (i) 在跳跃连接路径上增加一个 3 × 3 平均池化(average pooling); (ii) 用通道拼接(channel concatenation)替代逐元素相加(element-wise addition),这样可以在几乎不增加计算量的情况下扩大通道数。
由于使用了点卷积分组卷积和通道混洗,ShuffleNet 单元的所有组件都可以高效计算。与 ResNet(瓶颈设计)和 ResNeXt 相比,在相同设置下,我们的结构计算复杂度更低。例如,设输入尺寸为 c×h×wc \times h \times wc×h×w 且瓶颈通道数为 mmm,则:
-
ResNet 单元的计算量为 hw(2cm+9m2)hw(2cm + 9m^2)hw(2cm+9m2) FLOPs
-
ResNeXt 单元的计算量为 hw(2cm+9m2/g)hw(2cm + 9m^2/g)hw(2cm+9m2/g) FLOPs
-
ShuffleNet 单元的计算量仅为 hw(2cm/g+9m)hw(2cm/g + 9m)hw(2cm/g+9m) FLOPs,其中 ggg 为卷积的分组数。
换句话说,在相同的计算预算下,ShuffleNet 可以使用更宽的特征图(wider feature maps)。我们发现,这对小型网络至关重要,因为较小的网络通常由于通道数不足而难以有效处理信息。
此外,在 ShuffleNet 中,深度可分离卷积仅作用于瓶颈特征图。尽管深度卷积在理论上计算复杂度很低,但我们发现它在低功耗移动设备上的实际执行效率并不高,这可能是由于相比其他密集运算(dense operations),深度卷积的计算/内存访问比更差。这一缺点也在 [3] 中有所提及,该文基于 TensorFlow 运行时库进行了相关实验。因此,在 ShuffleNet 单元中,我们刻意仅在瓶颈层使用深度卷积,以尽可能减少额外开销。
精读
ShuffleNet 主要针对小型网络进行优化,核心改进点包括:
-
通道混洗(Channel Shuffle):
-
通过点卷积分组卷积(Pointwise Group Convolution)和通道混洗,提高计算效率和信息流动。
-
避免分组卷积层堆叠导致的信息隔离问题。
-
-
高效的 ShuffleNet 单元:
-
基于 ResNet 的瓶颈设计,在残差分支中采用 3×3 深度可分离卷积(Depthwise Convolution)。
-
用点卷积分组卷积替换标准 1×1 卷积,并加入通道混洗以优化计算效率。
-
在步长大于 1 时,引入 3×3 平均池化,并用通道拼接代替逐元素相加,以减少计算成本。
-
-
计算复杂度优化:
-
相比 ResNet 和 ResNeXt,在相同计算预算下,ShuffleNet 允许使用更宽的特征图,提高小型网络的表达能力。
-
计算量(FLOPs)明显降低,使其适用于资源受限的设备。
-
图(a)resnet残差网络详解:
第一个 1×1 卷积:降维(减少通道数),减少计算量
3×3 深度可分离卷积:特征提取
第二个 1×1 卷积:升维(恢复通道数)
跳跃连接:直接加上输入 x
图(b)stride=1网络结构详解:
第一个 1×1 卷积:降维(减少通道数),减少计算量
Channel Shuffle : 通道混排
3×3 深度可分离卷积:特征提取
第二个 1×1 卷积:升维(恢复通道数)
跳跃连接:直接加上输入 x
图(c)stride=2 网络结构详解:
第一个 1×1 卷积:降维(减少通道数),减少计算量
Channel Shuffle : 通道混排
3×3 深度可分离卷积:特征提取,stride=2
第二个 1×1 卷积:升维(恢复通道数)
跳跃连接:x 经过 3x3的avgpool,stride=2,后得到的特征矩阵与经过残差结构的特征矩阵进行concat
3.3 Network Architecture—网络体系结构
翻译
基于 ShuffleNet 单元,我们在表 1 中展示了整体 ShuffleNet 架构。该网络主要由一系列 ShuffleNet 单元组成,并被分为三个阶段。在每个阶段的第一个构建块中,步长(stride)设为 2。该阶段内的其他超参数保持不变,而在进入下一个阶段时,输出通道数会翻倍。与 [9] 类似,我们将每个 ShuffleNet 单元的瓶颈通道数设为输出通道数的 1/4。我们的目标是提供一个尽可能简单的参考设计,尽管我们发现进一步调整超参数可能会带来更好的效果。
在 ShuffleNet 单元中,分组数 g 控制着逐点卷积(pointwise convolution)的连接稀疏性。表 1 探讨了不同的分组数,并调整输出通道数,以确保整体计算成本大致保持不变(约 140 MFLOPs)。显然,在给定的计算复杂度约束下,更大的分组数会导致更多的输出通道(因此会有更多的卷积滤波器),有助于编码更多的信息。但同时,由于对应的输入通道数量有限,也可能导致单个卷积滤波器的性能下降。
在 第 4.1.1 节 中,我们将研究该参数在不同计算约束下的影响。此外,我们可以通过对通道数应用一个缩放因子 s 来定制网络的计算复杂度。例如,我们将表 1 中的网络称为 “ShuffleNet 1×”,那么 “ShuffleNet s×” 就表示将 ShuffleNet 1× 的滤波器数量按 s 倍缩放,因此整体计算复杂度大约是 ShuffleNet 1× 的 s² 倍。
精读
ShuffleNet 结构
-
由多个 ShuffleNet 单元组成,并分为 三个阶段。
-
每个阶段的第一个单元使用 步长 2 进行下采样。
-
进入下一阶段时,输出通道数翻倍。
瓶颈通道设计
-
每个 ShuffleNet 单元的瓶颈通道数设为 输出通道的 1/4,以确保计算效率。
在标准卷积中,大量计算发生在 1×1 逐点卷积,因为它用于通道混合(channel mixing)。
为了减少计算量,ShuffleNet 先将通道数降低(即瓶颈层),然后再进行计算,这样减少了 1×1 卷积的计算开销。
分组卷积(Group Convolution)
-
通过调整分组数 g 控制逐点卷积(1×1 卷积)的连接稀疏性。
-
增加 g 可提高信息编码能力,但可能因输入通道受限而影响单个卷积滤波器的性能。
-
研究表明,在不同计算约束下,合理选择 g 很重要。
计算复杂度与缩放因子
-
通过缩放因子 s 调整 ShuffleNet 的计算复杂度和通道数。
-
“ShuffleNet s×” 表示将 ShuffleNet 1× 的滤波器数量按 s 倍 调整,整体计算复杂度变为 s² 倍。
对于g组的理解:
g 分组相当于开小会,减少计算量,但为了不让大家闭门造车,ShuffleNet 通过洗牌(Channel Shuffle)让不同小组的信息能流通起来,提升模型效果。
四、Experiments—实验
翻译
我们主要在 ImageNet 2012 分类数据集 [29, 4] 上评估我们的模型。我们遵循 [40] 中的大部分训练设置和超参数,只有两个例外:(i)我们将权重衰减设置为 4e-5,而不是 1e-4,并使用线性衰减学习率策略(从 0.5 降至 0);(ii)我们在数据预处理时使用了略微不那么激进的尺度增强。类似的修改也在 [12] 中有所提到,因为这种小型网络通常容易发生欠拟合而非过拟合。训练一个模型需要 1 到 2 天,经过 3×10^5 次迭代,使用 4 个 GPU,批大小设置为 1024。为了基准测试,我们比较了 ImageNet 验证集上的单次裁剪 top-1 性能,即从 256×256 输入图像中裁剪出 224×224 的中心视图并评估分类准确率。我们对所有模型使用完全相同的设置,以确保公平比较。
精读
数据集与评估:模型在 ImageNet 2012 分类数据集上进行评估。
训练设置:
-
主要的两个修改:
-
权重衰减设置为 4e-5,而不是 1e-4。
-
使用线性衰减学习率策略(从 0.5 降至 0)
性能评估:
-
进行单次裁剪的 top-1 性能评估(裁剪出 224×224 的中心视图,输入图像大小为 256×256)。
-
在 ImageNet 验证集上评估分类准确率。
-
4.1 Ablation Study—消融实验
4.1.1 Pointwise Group Convolutions—分组逐点卷积
翻译
为了评估逐点分组卷积的重要性,我们比较了复杂度相同的 ShuffleNet 模型,其分组数量从 1 到 8 不等。当分组数为 1 时,不涉及逐点分组卷积,此时 ShuffleNet 单元变成了类似 Xception [3] 的结构。为了更好地理解,我们还将网络的宽度扩展到 3 种不同的复杂度,并分别比较它们的分类性能。结果显示在表 2 中。从结果可以看出,具有分组卷积的模型(g > 1)在性能上始终优于没有逐点分组卷积的模型(g = 1)。较小的模型通常更能从分组卷积中受益。例如,对于 ShuffleNet 1×,最佳模型(g = 8)比没有分组卷积的模型高出 1.2%;而对于 ShuffleNet 0.5× 和 0.25×,性能差距分别为 3.5% 和 4.4%。需要注意的是,分组卷积允许在给定复杂度约束下使用更多的特征图通道,因此我们推测性能提升来自于更宽的特征图,这有助于编码更多的信息。此外,较小的网络使用较窄的特征图,因此从更宽的特征图中受益更多。表 2 还显示,对于一些模型(例如 ShuffleNet 0.5×),当分组数较大(例如 g = 8)时,分类精度会达到饱和,甚至下降。随着分组数的增加(即特征图变宽),每个卷积滤波器的输入通道数减少,这可能会损害表示能力。有趣的是,我们还注意到对于较小的模型(如 ShuffleNet 0.25×),较大的分组数通常能带来更好的结果,这表明更宽的特征图对较小的模型带来了更多的好处。
精读
分组卷积的重要性:在评估逐点分组卷积的作用时,对比了不同分组数(从 1 到 8)的 ShuffleNet 模型。分组数为 1 时,模型类似 Xception 结构。
模型表现差异:有分组卷积(g > 1)的模型在分类性能上普遍优于没有分组卷积的模型(g = 1)。尤其是较小的模型,如 ShuffleNet 0.25× 和 0.5×,受益更多,性能提升显著(分别为 4.4% 和 3.5%)。
较大分组数的影响:随着分组数增加(例如 g = 8),模型的特征图变宽,能够使用更多的特征图通道。这有助于编码更多信息,但过多的分组数可能会导致每个卷积滤波器的输入通道数减少,影响表示能力,导致分类性能饱和或下降。
小模型的优势:对于较小的模型(如 ShuffleNet 0.25×),较大的分组数(例如 g = 8)通常带来更好的结果,说明更宽的特征图有助于提升较小模型的性能。
4.1.2 Channel Shuffle vs. No Shuffe—通道重排 vs 不重排
翻译
Shuffle操作的目的是为了在多个分组卷积层之间启用跨组信息流动。表3比较了在三种不同复杂度规模下,带有/不带有通道混洗的ShuffleNet结构(例如,分组数设置为3或8)的性能。结果清楚地表明,通道混洗在不同设置下始终能提升分类得分。特别是当分组数相对较大(例如 g = 8)时,带有通道混洗的模型显著优于没有通道混洗的模型,这表明跨组信息交流的重要性。
精读
Shuffle操作的目的:启用多个分组卷积层之间的跨组信息流动。
性能比较:表3比较了不同复杂度规模下,带有和不带有通道混洗的ShuffleNet结构,分组数设置为3或8。
结果显示:带有通道混洗的模型在不同设置下都能提高分类得分。
影响更大:当分组数较大(如 g = 8)时,带有通道混洗的模型表现显著优于没有通道混洗的模型。
4.2 Comparison with Other Structure Units—与其他结构单元比较
翻译
近年来,VGG [30]、ResNet [9]、GoogleNet [33]、ResNeXt [40] 和 Xception [3] 等领先的卷积单元通过使用大模型(例如≥1GFLOPs)追求最先进的结果,但未充分探索低复杂度条件。在本节中,我们调查了各种构建模块,并在相同的复杂度约束下与 ShuffleNet 进行比较。为了公平比较,我们使用了表1所示的整体网络架构。我们将 ShuffleNet 单元在第2到第4阶段替换为其他结构,然后调整通道数以确保复杂度保持不变。我们探索的结构包括:
-
VGG-like:遵循 VGG 网络的设计原则 [30],我们使用两层 3×3 卷积作为基本构建块。不同于 [30],我们在每个卷积后添加了一个批量归一化层 [15],以便使端到端训练更容易。
-
ResNet:我们在实验中采用了“瓶颈”设计,这种设计在 [9] 中已被证明更为高效。与 [9] 一致,瓶颈比率也为 1:4。
-
Xception-like:原始的 Xception 结构 [3] 涉及不同阶段的复杂设计或超参数,我们发现很难在小模型上进行公平比较。因此,我们从 ShuffleNet 中去除点卷积和通道混洗操作(也等同于 ShuffleNet,g = 1)。得到的结构与 [3] 中的“深度可分离卷积”思想相同,称为 Xception-like 结构。
-
ResNeXt:我们使用了 [40] 中建议的设置,基数为 16,瓶颈比率为 1:2。我们还探索了其他设置(例如瓶颈比率为 1:4),并获得了类似的结果。
我们使用完全相同的设置来训练这些模型。结果如表4所示。我们的 ShuffleNet 模型在不同复杂度下显著优于大多数其他模型。有趣的是,我们发现特征图通道数与分类精度之间有经验关系。例如,在 38 MFLOPs 的复杂度下,VGG-like、ResNet、ResNeXt、Xception-like 和 ShuffleNet 模型在第4阶段的输出通道数分别为 50、192、192、288 和 576,这与精度的提升一致。由于 ShuffleNet 的高效设计,我们可以在给定的计算预算下使用更多的通道,从而通常获得更好的性能。
需要注意的是,上述比较没有包括 GoogleNet 或 Inception 系列 [33, 34, 32]。我们发现将这种 Inception 结构生成小型网络并不容易,因为 Inception 模块的原始设计涉及了许多超参数。作为参考,第一版 GoogleNet [33] 的 top-1 错误率为 31.3%,计算复杂度为 1.5 GFLOPs(见表6)。更复杂的 Inception 版本 [34, 32] 精度更高,但涉及大幅度增加的复杂度。最近,Kim 等人提出了一种名为 PVANET 的轻量级网络结构 [19],该结构采用了 Inception 单元。我们重新实现的 PVANET(输入尺寸为 224×224)在 557 MFLOPs 的计算复杂度下,分类错误率为 29.7%,而我们的 ShuffleNet 2x 模型(g = 3)在 524 MFLOPs 的复杂度下,分类错误率为 26.3%(见表6)。
精读
ShuffleNet表现最好:在不同计算复杂度下,ShuffleNet模型的分类错误率最小,尤其在小型网络中。
VGG-like结构较差:在小型网络中,VGG-like结构的准确率较低。
通道数与准确度相关:较高的输出通道数通常带来更好的准确度。
ShuffleNet 2x 模型(g=3) 在 524 MFLOPs 的计算复杂度下,取得了 26.3% 的分类错误率,表现优于其他模型。
PVANET 在 557 MFLOPs 的计算复杂度下,错误率为 29.7%,比 ShuffleNet 高。
GoogleNet 的第一版在 1.5 GFLOPs 的复杂度下,错误率为 31.3%,虽然精度较低,但计算复杂度较高。
4.3 Comparison with MobileNets and Other Frameworks—与MobileNets和其他框架进行比较
翻译
最近,Howard 等人提出了 MobileNets [12],该网络主要关注为移动设备设计高效的网络架构。MobileNet 借鉴了 [3] 中的深度可分离卷积,并在小型模型上取得了最先进的结果。表5比较了不同复杂度水平下的分类得分。显然,我们的 ShuffleNet 模型在所有复杂度下都优于 MobileNet。尽管 ShuffleNet 网络专为小型模型(< 150 MFLOPs)设计,但我们发现它在更高计算成本下仍然优于 MobileNet,例如,在 500 MFLOPs 的复杂度下,ShuffleNet 比 MobileNet 1× 更准确 3.1%。对于更小的网络(约 40 MFLOPs),ShuffleNet 比 MobileNet 超过 7.8%。值得注意的是,我们的 ShuffleNet 架构包含 50 层,而 MobileNet 只有 28 层。为了更好地理解,我们还在一个 26 层的架构上尝试了 ShuffleNet,通过去掉第2到第4阶段的一半模块(见表5中的“ShuffleNet 0.5× shallow (g = 3)”)。结果表明,即使是较浅的模型,ShuffleNet 仍明显优于相应的 MobileNet,这意味着 ShuffleNet 的有效性主要来自其高效的结构,而不是深度。
表6比较了我们与一些流行模型的 ShuffleNet。结果表明,在相似精度下,ShuffleNet 的效率远高于其他模型。例如,ShuffleNet 0.5× 理论上比 AlexNet [21] 快 18 倍,且分类得分相当。我们将在第4.5节中评估实际运行时间。值得注意的是,简单的架构设计使得 ShuffleNet 易于与最新的进展相结合,例如 [13, 26]。例如,作者在 [13] 中提出了 Squeeze-and-Excitation(SE)模块,在大规模 ImageNet 模型上取得了最先进的结果。我们发现 SE 模块与 ShuffleNet 结合后也有效果,例如,将 ShuffleNet 2× 的 top-1 错误率提高到 24.7%(如表5所示)。有趣的是,尽管理论复杂度的增加可以忽略不计,但我们发现带有 SE 模块的 ShuffleNet 通常比“原生” ShuffleNet 在移动设备上慢 25% 到 40%,这意味着在低成本架构设计中,实际的速度评估是至关重要的。我们将在第4.5节中进一步讨论。
精读
ShuffleNet vs MobileNet:
-
ShuffleNet 在所有复杂度下优于 MobileNet,尤其是在较高计算成本下(如500 MFLOPs)。
-
对于小型网络(40 MFLOPs),ShuffleNet 比 MobileNet 高 7.8%。
ShuffleNet 结构效率:
-
ShuffleNet 的高效设计使其在较浅的模型中仍优于 MobileNet,性能来源于架构设计,而非深度。
与其他模型比较:
-
ShuffleNet 在类似准确度下比 AlexNet 高效,例如 0.5× 版本比 AlexNet 快 18 倍。
与新技术结合:
-
ShuffleNet 能与 SE模块结合,提升分类准确度至 24.7%。
SE模块对速度的影响:
-
SE模块提升准确度,但会使 ShuffleNet 在移动设备上变慢 25% 至 40%。
4.4 Generalization Ability—泛化能力
翻译
为了评估 ShuffleNet 模型的迁移学习泛化能力,我们在 MS COCO 目标检测任务上进行了测试。我们采用 Faster-RCNN 作为检测框架,并使用公开发布的 Caffe 代码进行训练,默认设置。与 [12] 类似,我们在 COCO 的 train+val 数据集上进行训练,排除了 5000 张 minival 图片,并在 minival 集上进行测试。表 7 显示了在两种输入分辨率下训练和评估的结果。与 MobileNet(复杂度分别为 524 和 569 MFLOPs)相比,ShuffleNet 2× 在两种分辨率下都明显优于 MobileNet;我们的 ShuffleNet 1× 在 600× 分辨率下的结果与 MobileNet 相当,但其复杂度减少了约 4 倍。我们推测,这一显著的提升部分归功于 ShuffleNet 简单的架构设计,没有复杂的附加设计。
精读
ShuffleNet 2× 在两个输入分辨率下显著超过了与其复杂度相当的 MobileNet(524 vs. 569 MFLOPs)。
ShuffleNet 1× 在 600× 分辨率下与 MobileNet 的表现相当,但复杂度约降低了 4 倍。
4.5 Actual Speedup Evaluation—实际加速评估
翻译
最后,我们在具有 ARM 平台的移动设备上评估了 ShuffleNet 模型的实际推理速度。尽管具有更大组数(例如 g = 4 或 g = 8)的 ShuffleNet 通常表现更好,但我们发现当前实现中这些模型的效率较低。经验上,g = 3 通常在准确度和实际推理时间之间提供了合适的权衡。如表8所示,我们使用了三种输入分辨率进行测试。由于内存访问和其他开销,我们发现每降低 4 倍理论复杂度,通常会在我们的实现中带来约 2.6 倍的实际加速。尽管如此,与 AlexNet [21] 相比,我们的 ShuffleNet 0.5× 模型在可比的分类精度下,仍能实现约 13 倍的实际加速(理论加速为 18 倍),这比以前的 AlexNet 级别模型或加速方法要快得多。
精读
ShuffleNet 在 ARM 平台的移动设备上进行推理速度评估。尽管较大组数(g = 4 或 g = 8)的模型性能较好,但 g = 3 提供了在准确度和推理速度之间的最佳平衡。测试结果显示,每降低 4 倍的理论复杂度,实际加速约为 2.6 倍。与 AlexNet 相比,ShuffleNet 0.5× 实现了约 13 倍的实际加速,在相似分类精度下表现更为高效。