ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
参考文章:https://blog.csdn.net/u014380165/article/details/81322175
Abstract
目前,神经网络架构设计主要由计算复杂度的间接度量(即FLOPs)引导。然而,直接度量(例如,速度)还取决于诸如存储器访问成本和平台特性之类的其他因素。因此,这项工作建议评估目标平台上的直接度量,而不仅仅考虑FLOPs。
1 Introduction
实时任务通常旨在在由目标平台(例如,硬件)和应用场景(例如,自动驾驶需要低等待时间)给出的有限计算预算下获得最佳准确度。这激发了一系列针对轻量级架构设计和更快速度准确性的工作,包括Xception ,MobileNet ,MobileNet V2 ,ShuffleNet和CondenseNet 。Group convolution 和depth-wise convolution 这些工作中至关重要。
为了测量计算复杂性,广泛使用的度量是浮点运算的数量,或FLOPs,这个指标主要衡量的就是卷积层的乘法操作。但是这篇文章通过一系列的实验发现FLOPs并不能完全衡量模型速度,比如在Figure1(c)(d)中,相同MFLOPs的网络实际速度差别却很大,因此以FLOPs作为衡量模型速度的指标是有问题的。
间接(FLOPs)和直接(速度)指标之间的差异可归因于两个主要原因。首先,FLOP没有考虑几个对速度有很大影响的重要因素。一个这样的因素是内存访问消耗时间(MAC)。在诸如group卷积的某些操作中,这种成本占运行时的很大一部分。它可能是具有强大计算能力的设备(例如GPU)的瓶颈。另一个是并行度。在相同的FLOP下,具有高并行度的模型可能比具有低并行度的另一个模型快得多。
其次,具有相同FLOPs的操作可能具有不同的运行时间,具体取决于平台。例如,张量分解广泛用于早期工作以加速矩阵乘法。然而,最近的工作发现分解在GPU上甚至更慢,尽管它将FLOP降低了75%。我们调查了这个问题并发现这是因为最新的CUDNN 库专门为3×3转换而优化。我们当然不能认为3×3转换比1×1转速慢9倍。
通过这些观察,我们提出应该考虑两个原则来实现有效的网络架构设计。首先,应该使用直接度量(例如,速度)而不是间接度量(例如,FLOPs)。其次,应在目标平台上评估此类指标。
2 高效网络设计实用指南
我们的研究是在两个广泛采用的硬件上进行的,输入图像大小为224×224。每个网络随机初始化并评估100次。
为了开始我们的研究,我们分析了两个SOTA的网络的运行时间性能,ShuffleNet v1和MobileNet v2。它们广泛用于移动设备等低端设备。它们代表了当前的趋势,其核心是group convolution 和 depth-wise convolution,它们也是其他SOTA的关键组件,如ResNeXt ,Xception ,MobileNet和CondenseNet。
整个运行时被分解用于不同的操作,如图2所示。我们注意到FLOPs度量仅考虑卷积部分,虽然这部分消耗的时间最多,但其他操作包括数据I / O,数据shuffle和element-wise操作(AddTensor,ReLU等)也占用了相当多的时间。因此,FLOP对实际运行时的估计不够准确。
G1)卷积层的输入和输出特征通道数相等时MAC最小
现代网络通常采用深度可分离卷积depthwise separable convolutions,其中逐点卷积(即1×1卷积)占复杂性的大部分。我们研究了1×1卷积的kernel shape。形状由两个参数指定:输入通道数 c 1 {c_1} c1和输出通道数 c 2 {c_2} c2。设h和w为特征映射的spatial size,1×1卷积的FLOPs为 B = h w c 1 c 2 B = hw{c_1}{c_2} B=hwc1c2,更具体的写法是 B = 1 ∗ 1 ∗ h w c 1 c 2 B = 1*1*hw{c_1}{c_2} B=1∗1∗hwc1c2。
接下来看看存储空间,因为是1*1卷积,所以输入特征和输出特征的尺寸是相同的,这里用h和w表示,其中 h w c 1 hw{c_1} hwc