深度学习模型之CNN(十五)ShuffleNetv1v2理论讲解

ShuffleNetv1

在ShuffleNetv1中,作者提出channel shuffle思想,也就是ShuffleNet Unit中全是GConv和DWConv。原论文: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

ShuffleNetv1v2性能对比

Channel Shuffle

在普通组卷积过程中,尽管减少了参数与计算量,但是组与组之间是没有信息交流的(如下图左所示)。为了解决这个问题,ShuffleNetv1中提出channel shuffle的概念,假设在GConv1中划分为g组,则在每一组中划分g份,将每一组中的第1份放在GConv2的第一组中,每一组中的第2份放在GConv2的第二组中…将每一组中的第i份放在GConv2的第i组中。

channel shuffle概念

作者发现:在ResNeXt网络中的PW卷积(1x1普通卷积)在理论上占据了整个网络计算量的93.4%,由此得知,在网络中的Group Conv在理论上占用网络计算量是很少的,大部分被1x1的普通卷积所占用了计算量。

因此作者将bneck中第一层和最后一层的1x1普通卷积改为1x1组卷积,且加入Channel Shuffle处理。下图(左)是原始的普通1x1卷积;下图(中)是将block中第一层和最后一层普通卷积改为组卷积,stride = 1;

下图(右)是shortcut中通过一个3x3平均池化下采样操作且stride = 2池化层进行下采样(在ResNet以及ResNeXt网络中,如果stride = 2,那么shortcut中直接采用卷积下采样),在主分支中通过的DW卷积stride = 2,最后将主分支和shortcut的输出通过Concat拼接在一起。

1x1普通卷积改为1x1Group Conv

网络参数

论文中大部分搭建网络采用是g = 3的参数,对应指的是group的个数

  • repeat:指该层重复次数;
  • Stage2:将shufflenet当中每个block进行堆叠,第一个block的stride = 2,重复堆叠1次,第二个block的stride = 1,重复堆叠3次。
  • GlobalPool:全球池化
ShuffleNetv1网络参数

参数对比

假设输入特征矩阵为c x h x w,bottleneck中1x1卷积或3x3卷积的输出channel为m。(FLOPs:计算量)

备注:经过下图的bottleneck之后,其输入特征矩阵和输出特征矩阵的channel保持一致(因为主分支和shortcut直接相加)

ResNet ResNeXt和ShuffleNet参数对比

ShuffleNetv2

FLOPS:全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。( 硬件 )

FLOPs:s小写,指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。(模型在论文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs )

ShuffleNetv2中,作者提到计算复杂度不能只看FLOPs,还需参考其他的指标,之后提出4条如何设计出高效的网络准则,并且基于准则上提出新的block设计。原论文:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

在之前的网络设计当中(例如MobileNet和ShuffleNetv1)经常使用ELOPs(衡量模型运算/复杂度的间接指标),但在实际使用过程中是直接由推理速度(直接的评价指标)去判断计算的快慢。

计算复杂度不能只看FLOPs,还需参考其他的指标,例如MAC内存访问的时间成本(memory access cost)和并行等级(degree of parallelism)。在相同FLOPs下,会因为并行等级、运行平台造成执行消耗时间的不同。

设计高效网络的4条建议

  • 当**卷积层的输入特征矩阵与输出特征矩阵channel相等($c_1=c_2$)**时MAC最小(保持FLOPs不变时)(针对1x1卷积层)

B为使用1x1卷积层时消耗的FLOPs

MAC = $hw(c_1+c_2)+c_1c_2 = hwc_1+hwc_2+c_1c_2$ = 输入特征矩阵的内存消耗+输出特征矩阵的内存消耗+卷积核的内存消耗

g1-MAC最小时
  • GConv的groups增大时(保持FLOPs不变时),MAC也会增大
g2-Group
  • 网络设计的碎片化程度(分支程度,串联/并联)越高,速度越慢

网络设计碎片化程度在越高的情况下,虽然会提升模型的准确率,但同样会降低运行效率

g3-网络碎片化
  • Element-wise操作带来的影响是不可忽视的

ReLU激活操作、相加操作(shortcut)、偏置等对每一个元素进行操作的都叫Element-wise操作

特点:ELOPs很小,MAC很大

g4-Element-wise操作

总结

  1. 尽可能让输入特征矩阵与输出特征矩阵的比值为1;
  2. 需要注意group conv的计算成本,不能一味地增大group数,虽然增大group数会降低参数和减少ELOPs,但是会增加计算成本;
  3. 降低网络的碎片程度,如果需要一个高效的网络,便不要设计过多分支的网路结构;
  4. 尽可能减少使用Element-wise。

基于4点建议设计的ShuffleNetv2

下图(a)(b)为ShuffleNetv1中stride为1和2的网络结构,下图(c)(d)为ShuffleNetv2中stride为1和2的网路结构情况。

在(c)中,首先将输入特征矩阵的channel划分为两个分支(channel split操作),分别为c-c‘和c’。根据g3(减少碎片化程度),所以在左边分支中未进行任何操作,另一个分支中由三个卷积层组成,输入特征矩阵和输出特征矩阵拥有相同的channel,且两个1x1的卷积不再使用group conv。最后通过concat拼接。

在(d)中,没有channel split操作,因此通过concat拼接之后输出特征矩阵的channel翻倍。

4条高效网络设计

网络参数

网络框架与ShuffleNetv1基本保持一致,唯一不同在于ShuffleNetv2比v1多了一个Conv5的1x1卷积操作

而且对于stage2的第一个block,它的两个分支中输出的channel并不等于输入的channel,而是直接设置为指定输出channe的一半,比如对于1x版本,每分支的channel应该是58,不是24。

ShuffleNetv2网络参数

性能指标

ShuffleNet v2 0.5/1x版本

ShuffleNetv2 0.5/1x版本性能指标

ShuffleNet v2 1.5/2x版本

ShuffleNetv2 1.5/2x版本性能指标

ShuffleNetv2 2x版本+SE性能指标

ShuffleNetv2 2.0版本+SE性能指标