论文名称:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
论文地址:https://arxiv.org/abs/1807.11164
目前,CNN网络在图像识别领域大放异彩,从最初的AlexNet到后面的GoogLeNet,ResNet,识别精度越来越高,但是除了精度之外,模型的计算复杂度也越来越引起大家的思考,如何降低网络的复杂度,以使网络可以高效的运行在诸如手机等移动端设备,也得到了众多研究者的研究。本文便主要在这方面发力,提出了提高网络速度设计的4个准则,并基于此设计了shuffleNet v2,在速度、精度均超过了目前的主流轻量级网络(shuffleNet v1, mobileNet v2等),本文是Face++提出,发表于ECCV2018.
下面详细介绍一下这篇文章
作者在开篇首先指出,目前评价一个网络的复杂度的指标往往是FLOPs( FLOPs简单解释就是网络执行了多少的multiply-adds操作),但是这种评价指标往往是不正确的,因为FLOPs可能不能反映出网络模型的执行速度或者时延,如下图所示:
通过观察可以发现图中(c,d)可以发现,具有相似的FLOPs的网络,执行的速度却不一样。
那么,为什么会出现这个矛盾呢?作者解释有两个原因:
- 一些严重影响速度的因素没有考虑在FLOPs中。比如MAC(memory access cost内存访问成本,计算机在进行计算时候要加载到cache,然后计算,这是需要时间的)。比如分组卷积(group convolution)就会消耗较大的MAC。并行度,如果网络的并行度较高,那么速度就会有显著的提升。
- 计算平台的不同,比如tensor运行的使用会提高计算速度,(但是最近发现,即使通过分解(decomposition)可以减少75%的FLOPs,但是计算速度却便慢了,究其原因是因为最近更新的cudnn加强了对3*3conv计算的优化,3*3卷积并不是1*1卷积计算速度的9倍这么简单)
基于以上的分析,作者提出了2个需要考虑的网络执行效率对比的设计准则:
- 使用正确的速度度量方式,代替FLOPs
- 要在目标计算平台上计算,不然结果不具有代表性。
如下这张图是作者分别在GPU(1080ti, cudnn7.0)以及ARM(高通骁龙810)环境下的网络运行时间展示,可以发现,除了卷积部分,还有很大部分时间在做其他的事情,这也说明,仅仅使用FLOPs是不够的。并且从该图可可以看出ARM相比较于GPU确实慢了一些,假设读取数据时间一致,GPU中卷积操作只占到将近一半,而ARM中已经占到了约90%。
基于此,作者做了如下的分析?
G1:输入输出具有相同channel的时候,内存消耗是最小的
为什么这么说:
由于目前主流网络均使用的depthwise separable convolutions,其中pointwise convolution占据了很大一块的运算量,这个在shuffleNet V1中有说明详细参见博客:shuffleNet V1,作者以1*1网络为例,假设feature map的大小为h*w输入输出channel分别为c1和c2,那么:
FLOPs:
MAC: