轻量级网络ShuffleNetV1 和 ShuffleNetV2

Posted 超级无敌陈大佬的跟班

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了轻量级网络ShuffleNetV1 和 ShuffleNetV2相关的知识,希望对你有一定的参考价值。

目录

一、ShuffleNet(2017年)

1. ShuffleNet的亮点

2 .ShuffleNet网络结构

2.1 Group ResNet Block

2.2 分组数g的作用

​ 3. ShuffleNet网络性能

1)不同参数下的精度对比

 2)有无channle shuffle的性能对比

 3) ShuffleNet与MobileNet的精度对比

二、ShuffleNetv2(ECCV2018)

设计理念

二、ShuffleNetv2网络结构


一、ShuffleNet(2017年)

1. ShuffleNet的亮点

  • 结合Group convolutionsChannel Shuffle

        group conv的问题:现在的精简CNN网络设计中使用Group convolutions已经成为一种趋势,它可有效地减少传统CNN所需的密集计算的运算量。但同时由于Groups之间彼此并不share feature map特征,这样就会导致每个filter只对限定的一部分输入特征可见,最终使得输出特征集合的表达能力大大降低。

        本文改进点:为了有效地对冲Groups convolution使用导致的Groups间特征互不相通的负面影响,作者提出了对Group convolution计算后对输出的output feature maps进行shuffle处理,以使得接下来的Group convolution filters可在每个group所输出的部分channels构成的集合上进行计算。

(a)普通group卷积.(c)group卷积+shuffle操作

        如图1-a所示,其中GConv是group convolution,这里分组数是3。可以看到当堆积GConv层后一个问题是不同组之间的特征图是不通信的,这就好像分了三个互不相干的路,大家各走各的,这目测会降低网络的特征提取能力。这样你也可以理解为什么Xception,MobileNet等网络采用密集的1x1卷积,因为要保证group convolution之后不同组的特征图之间的信息交流。但是达到上面那个目的,我们不一定非要采用dense pointwise convolution。如图1-b所示,你可以对group convolution之后的特征图进行“重组”,这样可以保证接下了采用的group convolution其输入来自不同的组,因此信息可以在不同组之间流转。这个操作等价于图2-c,即group convolution之后对channels进行shuffle,但并不是随机的,其实是“均匀地打乱”。

        在程序上实现channel shuffle是非常容易的:假定将输入层分为 g 组,总通道数为 n ,首先你将通道那个维度拆分为(g, n) 两个维度,然后将这两个维度转置变成(n, g),最后重新reshape成一个维度。仅需要简单的维度操作和转置就可以实现均匀的shuffle。利用channel shuffle就可以充分发挥group convolution的优点,而避免其缺点。

2 .ShuffleNet网络结构

2.1 Group ResNet Block

ShuffleNet的基本单元是在一个残差单元的基础上改进而成的。

  • 原始Resnet block:如图2-a所示,这是一个包含3层的残差单元:首先是1x1卷积,然后是3x3的depthwise convolution(DWConv,主要是为了降低计算量),这里的3x3卷积是瓶颈层(bottleneck),紧接着是1x1卷积,最后是一个短路连接,将输入直接加到输出上。
  • 改进的group Resnet block:将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。值得注意的是3x3卷积后面没有增加channel shuffle,按paper的意思,对于这样一个残差单元,一个channel shuffle操作是足够了。还有就是3x3的depthwise convolution之后没有使用ReLU激活函数。改进之后如图2-b所示。对于残差单元,如果stride=1时,此时输入与输出shape一致可以直接相加,
  • 改进的group Resnet block(stride=2):当stride=2时,通道数增加,而特征图大小减小,此时输入与输出不匹配。一般情况下可以采用一个1x1卷积将输入映射成和输出一样的shape。但是在ShuffleNet中,却采用了不一样的策略,如图2-c所示:对原输入采用stride=2的3x3 avg pool,这样得到和输出一样大小的特征图,然后将得到特征图与输出进行连接(concat),而不是相加(add)。这样做的目的主要是降低计算量与参数大小。
(a)原始resnet block;(b)采用group卷积改进后的结构;(c)有下采样的gruop Resnet结构

2.2 分组数g的作用

        如下表所示,参数 g 控制了group convolution中的分组数,分组越多,在相同计算资源下,可以使用更多的通道数,所以 g 越大时,采用了更多的卷积核。这里给个例子,当 g=3 时,对于第一阶段的第一个基本单元,其输入通道数为24,输出通道数为240,但是其stride=2,那么由于原输入通过avg pool可以贡献24个通道,所以相当于左支只需要产生240-24=216通道,中间瓶颈层的通道数就为216/4=54。其他的可以以此类推。当完成三阶段后,采用global pool将特征图大小降为1x1,最后是输出类别预测值的全连接层。

3. ShuffleNet网络性能

1)不同参数下的精度对比

        表2给出了采用不同的 g 值的ShuffleNet在ImageNet上的实验结果。基本上当 g 越大时,效果越好,这是因为采用更多的分组后,在相同的计算约束下可以使用更多的通道数,或者说特征图数量增加,网络的特征提取能力增强,网络性能得到提升。注意Shuffle 1x是基准模型,而0.5x和0.25x表示的是在基准模型上将通道数缩小为原来的0.5和0.25。

 2)有无channle shuffle的性能对比

        下表对比了不采用channle shuffle和采用之后的网络性能,如表3所示,采用channle shuffle之后,网络性能更好,从而证明channle shuffle的有效性。        

 3) ShuffleNet与MobileNet的精度对比

        ShuffleNet与MobileNet的对比,如表4所示。可以看到ShuffleNet不仅计算复杂度更低,而且精度更好。

参考链接:https://zhuanlan.zhihu.com/p/32304419

二、ShuffleNetv2(ECCV2018)

创新点:针对ShuffleNetV1中的一些内存不友好操作进行了改进(输入输出维度不一致,分组卷积数过多)。

设计理念

        存在的问题:目前衡量模型复杂度的一个通用指标是FLOPs,具体指的是multiply-add数量,但是这却是一个间接指标,因为它不完全等同于速度。如图1中的(c)和(d),可以看到相同FLOPs的两个模型,其速度却存在差异。这种不一致主要归结为两个原因,首先影响速度的不仅仅是FLOPs,如内存使用量(memory access cost, MAC),这不能忽略,对于GPUs来说可能会是瓶颈。另外模型的并行程度也影响速度,并行度高的模型速度相对更快。另外一个原因,模型在不同平台上的运行速度是有差异的,如GPU和ARM,而且采用不同的库也会有影响。

        实验分析:根据上面的问题,作者在特定的平台下研究ShuffleNetv1和MobileNetv2的运行时间,并结合理论与实验得到了4条实用的指导原则:

  • G1)输入输出通道相同时内存访问量最小

        对于轻量级CNN网络,常采用深度可分割卷积(depthwise separable convolutions),其中点卷积( pointwise convolution)即1x1卷积复杂度最大。这里假定输入和输出特征的通道数分别为 和 c2 ,特征图的空间大小为 h*w,那么1x1卷积的FLOPs为 。对应的MAC为 (这里假定内存足够),根据均值不等式,固定 时,MAC存在下限(令 ):

        仅当 c1 = c2 时,MAC取最小值,这个理论分析也通过实验得到证实,如表1所示,输入输出通道比为1:1时速度更快。

  • G2)过量使用组卷积会增加MAC

        组卷积(group convolution)是常用的设计组件,因为它可以减少复杂度却不损失模型容量。但是这里发现,分组过多会增加MAC。对于组卷积,FLOPs为 (其中 g 是组数),而对应的MAC为 。如果固定输入以及 ,那么MAC为:

可以看到,当 增加时,MAC会同时增加。这点也通过实验证实,所以明智之举是不要使用太大 的组卷积。

  • G3)网络碎片化会降低并行度

        一些网络如Inception,以及Auto ML自动产生的网络NASNET-A,它们倾向于采用“多路”结构,即存在一个block中很多不同的小卷积或者pooling,这很容易造成网络碎片化,减低模型的并行度,相应速度会慢,这也可以通过实验得到证明。

  • G4)不能忽略元素级操作

        对于元素级(element-wise operators)比如ReLU和Add,虽然它们的FLOPs较小,但是却需要较大的MAC。这里实验发现如果将ResNet中残差单元中的ReLU和shortcut移除的话,速度有20%的提升。

基于上面4条指导准则总结如下:

  • 1x1卷积进行平衡输入和输出的通道大小;
  • 组卷积要谨慎使用,注意分组数;
  • 避免网络的碎片化;
  • 减少元素级运算。

二、ShuffleNetv2网络结构

ShuffleNet两个版本结构上的对比

ShuffleNetV1结构的问题:

        如上图(a)(b)在ShuffleNetv1的模块中,大量使用了1x1组卷积,这违背了G2原则,另外v1采用了类似ResNet中的瓶颈层(bottleneck layer),输入和输出通道数不同,这违背了G1原则。同时使用过多的组,也违背了G3原则。短路连接中存在大量的元素级Add运算,这违背了G4原则。

ShuffleNetV2改进:

        为了改善v1的缺陷,v2版本引入了一种新的运算:channel split。具体来说,在开始时先将输入特征图在通道维度分成两个分支:通道数分别为 ,实际实现时  。左边分支做同等映射,右边的分支包含3个连续的卷积,并且输入和输出通道相同,这符合G1。而且两个1x1卷积不再是组卷积,这符合G2,另外两个分支相当于已经分成两组。两个分支的输出不再是Add元素,而是concat在一起,紧接着是对两个分支concat结果进行channle shuffle,以保证两个分支信息交流。其实concat和channel shuffle可以和下一个模块单元的channel split合成一个元素级运算,这符合原则G4

        对于下采样模块,不再有channel split,而是每个分支都是直接copy一份输入,每个分支都有stride=2的下采样,最后concat在一起后,特征图空间大小减半,但是通道数翻倍。

        ShuffleNetv2的整体结构如表2所示,基本与v1类似,其中设定每个block的channel数,如0.5x,1x,可以调整模型的复杂度。

最终精度指标:

 

        可以看到,在同等条件下,ShuffleNetv2相比其他模型速度稍快,而且准确度也稍好一点。同时作者还设计了大的ShuffleNetv2网络,相比ResNet结构,其效果照样具有竞争力。

        从一定程度上说,ShuffleNetv2借鉴了DenseNet网络,把shortcut结构从Add换成了Concat,这实现了特征重用。但是不同于DenseNet,v2并不是密集地concat,而且concat之后有channel shuffle以混合特征,这或许是v2即快又好的一个重要原因。

 

以上是关于轻量级网络ShuffleNetV1 和 ShuffleNetV2的主要内容,如果未能解决你的问题,请参考以下文章

轻量化网络总结[2]--ShuffleNetv1/v2,OSNet,GHostNet

spark shuff机制

解决问题:only integer scalar arrays can be converted to a scalar index

SENet及对轻量级网络的一些理解

Spark参数调优

轻量级神经网络架构