ShuffleNet系列之ShuffleNet_v2

ShuffleNet系列之ShuffleNet_v1html

MobileNet系列之MobileNet_v2算法

Inception系列之Batch-Normalization微信

导言:网络

    目前一些网络模型如MobileNet_v1, v2,ShuffleNet_v1, Xception采用了分组卷积,深度可分离卷积等操做,这些操做在必定程度上大大减小了FLOPs,但FLOPs并非一个直接衡量模型速度或者大小的指标,它只是经过理论上的计算量来衡量模型,然而在实际设备上,因为各类各样的优化计算操做,致使计算量并不能准确地衡量模型的速度,换言之,相同的FLOPs会有不一样的推理速度。ide

    这是一篇相似于《Rethinking the Inception Architecture for Computer Vision》(即Inception_v2)的论文,在Inception_v2论文中提出了四条设计卷积网络模型的原则,Inception_v2就是基于这些原则上设计而来。一样,shuffleNet_v2(即《Pratical Guidelines for Efficient CNN Architecture Design》,一看这名字就知道很值得一读)指出了四个影响模型实际推理速度的操做,并在尽可能避免这些操做的基础上提出了ShuffleNet_v2结构。post

    ShuffleNet v2实现了在一样的FLOPs下,速度明显快于其余相似网络。例如,在500MFLOPs,ShuffleNet v2比MobileNet v2快58%,比ShuffleNet v1快63%,比Xception快25%。性能

Direct metrics

 

    前面提到FLOPs是经过理论上的计算量来衡量模型速度,这是一个indirect metrics,与direct metrics(如速度)之间是存在一些差别。主要缘由一个是FLOPs忽略了一些重要的因素,一个是MAC (memory access cost),即内存访问的时间成本。例如分组卷积,其使得底层使用的一些优化实现算法因为分组后实现性能更低,从而致使,分组数越大,时间成本越高。另外一个是并行度,一样FLOPs下,高并行度的模型速度快于低并行度的模型。优化

    第二个是不一样平台下,一样的FLOPs的模型运行时间不一样。例如在最新的CUDNN library中,优化实现的3x3卷积所花费的时间并无1x1卷积的9倍。ui

    如图所示,这是一个模型在GPU上各项操做所花费的时间,FLOPs仅表示了Conv部分的计算量,而实际上Elemwise、Data相关部分也耗费至关大的时间。所以,仅仅使用FLOPs这个indirect metrics来衡量模型速度是不够的。设计

    ShuffleNet v2使用实际运行时间来衡量模型。

 

高效设计CNN模型的实际指南

 

    ShuffleNet v2进行了四项实验,得出了一些比较耗时的操做,通过原理分析,提出了四条设计原则。

1. 卷积层输入输出通道数相同时,MAC最小

2. 分组卷积的分组数越大,MAC越大

3. 网络支路会下降模型的并行度

4. Element-wise操做不可忽视

 

01 卷积层输入输出通道数相同时,MAC最小

    为简化计算表达式,这里使用1x1卷积来进行理论上的推导。

    对于空间大小为 h,w的特征图,输入和输出通道数分别为c1和c2,使用1x1卷积, 则FLOPs为B = h x w x c1 x c2。而MAC = hw(c1 + c2 ) + c1 x c2。这里hwc1为输入特征图内存访问成本,hwc2为输出特征图内存访问时间成本,c1xc2x1x1为卷积核内存访问时间成本。将B表达式代入MAC表达式中,并根据不等式定理,可有以下不等式:

    由此式可知,MAC存在下限,当c1 = c2时,MAC取最小值。所以,第一组实验即为在相同的FLOPs下,取不一样的输入输出通道数的比值c1/c2,查看不一样c1/c2下模型运行时间。

    如图所示,理论至关正确。在1:1时模型速度最快。

02 分组卷积的分组数越大,MAC越大

    分组卷积在一方面,使得在相同FLOPs下,分组数越大,在通道上的密集卷积就会越稀疏,模型精度也会增长,在另外一方面,更多的分组数致使MAC增长。

    使用分组卷积的FLOPs表达式为B=h w c1 c2 /g , MAC表达式以下:

    第二组实验是在相同的FLOPs下,查看不一样的分组数对模型的运行速度:

  所以,分组数须要合理的选择,须要在运行时间和精度上平衡。

 

03 网络支路会下降模型的并行度

    在GoogLeNet(也就是Inception_v1)系列中,使用了多条支路,最后经过concat的方式拼接。这样的支路不只提到了精度,但同时也下降了效率,这是由于支路对GPU并行运算来讲是不友好的,此外,它还引入了额外的开销,如内核启动与同步。

    第三组实验是在相同FLOPs状况下,设置四个支路数不一样的一个网络,比较它们运行的速度。

    实验证实,只有一条支路时,运行速度最快。所以,在网络结构中支路数能够提到精度,但也会下降运行速度,从而影响实时性。

04 Element-wise操做不可忽视

    正如上面给的那个图,Element-wise操做在GPU上占的时间是至关多的。Element-wise操做有ReLU, AddTensor, AddBias等。它们都有比较小的FLOPs,却有比较大的MAC。特别地,depthwise conv也能够认为是一个Element-wise操做,由于它有较大的MAC/FLOPs比值。

    对于第四组实验,使用ResNet中的bottleneck单元(也就是1x1卷积后接3x3卷积,再接1x1卷积,中间使用了ReLU, 另有一个shortcut链接),设置有无shortcut, ReLU四个不一样的对比,得出它们的运行时间。

    实验证实,ReLU,shortcut这些Element-wise会下降运行时间。

    对此,shuffleNet v1使用多的分组数,违背了第二条原则,使用bottleneck类似的结构违背了第一条原则,MobileNet v2使用倒残差结构违背了第一条,且在通道数较多的feature map上使用了depthwise conv和ReLU违背了第四条,自动生成的结构有较多支路,违背了第三条。

    注意:这里指的违背了这些原则,并非说设计很差。以第二条分组数和第三条支路数为例,不能由于它们会下降模型运行时间,就不再使用支路和分组卷积,毕竟它们对模型精度有较大提高,所以须要选择合适的分组数和支路数,以便在速度上和精度上取得权衡。

 

ShuffleNet v2结构

 

    shuffleNet v2是在shuffleNet v1 unit的基础上,根据上面四组实验得出的经验,进行适当的权衡精度与速度而调整的。

    图a为shuffleNet v1正常Unit, 图b为shuffleNet v1降采样Unit,图c为shuffleNet v2 正常Unit, 图d为shuffleNet v2 降采样Unit.

    在shuffleNet v2中引入了Channel Split, 将通道数分为c’ 和c - c’,这里c’取c/2。一部分进行卷积操做,另外一部分直接进行concat。卷积的那一路的输入和输出相等,这是考虑到第一条原则。两个1x1卷积再也不进行分组,一部分缘由是第二条原则,另外一部分是由于Channel split就至关因而分组了。两路进行concat后,再进行Channel Shuffle,这是为了通道上的信息进行流动。不然,左端那路的一半通道信息将一直进行到后面都没有经过卷积层。

    对于空间降采样层,这个Unit是没有Channel split,这样能够实如今两路concat后,通道数翻倍。其他改动具体看图更容易理解。

 

05 网络结构

    结构跟shuffleNet v1基本一致,惟一的差异是在全局平均池化前加入了1x1卷积,以便混合特征。右边的output channels下的0.5x, 1x等,只是用来表示不一样的模型尺寸,也就是通道数不同。

 

06 网络精度的分析

    shuffleNet v2不只效率高,并且精度也高。这有两个主要的缘由,高效率是由于使用了更多特征通道和更大的网络容量来构建Block。第二点,在每一个block中,一半的通道直接进入下一个block参与下一个block,这能够认为是特征再利用(feature reuse),相似于DenseNet 和CondenseNet中的想法,特征再利用是高效高精度的设计。

Experiment

 

    实验部分通常没有能够多说的地方。看图表更能比文字表达清晰。

若有错误或疑问,欢迎留言指出。

本文来源于微信公众号“ CV技术指南 ” 。如有错误或疑问,欢迎在公众号中留言指出。

欢迎关注公众号“CV技术指南”,主要进行计算机视觉方向的论文解读,最新技术跟踪,以及CV技术的总结。正在进行的系列有网络模型解读、行为识别和CV技术总结。

原创文章第一时间在公众号中更新,博客只在有空时间才更新公众号文章

相关文章
相关标签/搜索