轻量级网络之ShuffleNet V2

论文:ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design

论文链接:https://arxiv.org/abs/1807.11164

代码:

  • Caffe

因项目需要跑了ShuffleNet V2,发现比resnet50足足快了60ms,识别率也能满足项目需求。看了论文,特来分享。

ShuffleNet V2主要对目前一些主流网络进行多组对比实验,并从这些对比实验中进行一定的理论分析和总结,最后得出4条关于 CNN 网络结构设计的准则,帮助设计高效的神经网络结构。下面先贴出文中观点:

2个问题:

(1)FLOPs(浮点计算量)不能作为衡量目标检测模型运行速度的标准,因为计算速度跟平台框架、硬件设备还有关;

(2)MAC(Memory access cost)也是影响模型运行速度的一大因素;

衡量模型运行速度,应采用如运行时间(speed\runtime)这样的指标。建议在GPU上,使用Batches/sec进行速度衡量;在ARM上,使用Images/sec进行衡量。

4条网络设计准则:
G1:卷积操作时,输入通道数尽量等于输出通道数(卷积核数量)可降低MAC;
G2:谨慎使用group convolutions,因为它会增加MAC;
G3:降低网络碎片化程度(减少分段储存);
G4:减少element-wise运算,如ReLu,AddTensor,AddBias;

所以本文基于上述的4条准则,以及之前的shuffleNet,提出了 ShuffleNet V2的网络结构。

ShuffleNet存在的问题:

(1)pointwise group convolutions和bottleneck结构增加了MAC(G1和G2);

(2)使用较多的groups违反了G3;

(3)Add属于element-wise操作,违反了G4;

所以在 ShuffleNet V2 中增加了几种新特性,ShuffleNet V2网络结构单元如下所示:

轻量级网络之ShuffleNet V2_第1张图片

channel split 其实就是将通道数一分为2,化成两分支来代替原先的分组卷积结构(G2);并且每个分支中的卷积层都是保持输入输出通道数相同(G1);其中一个分支不采取任何操作减少基本单元数(G3);最后使用了 concat 代替原来的 add操作,并且后面不加 ReLU (G4)。concat后加入channle shuffle 来增加通道之间的信息交流。 对于下采样层,在这一层中对通道数进行翻倍。 在网络结构的最后,即平均值池化层前加入一层 1x1 的卷积层来进一步的混合特征。

shuffleNet V2 的整体结构如下表:

轻量级网络之ShuffleNet V2_第2张图片

可以对照着ShuffleNet V1来看

轻量级网络之ShuffleNet V2_第3张图片

对照这两个表格,区别在于ShuffleNet V2增加了一个卷积层,以及各个stage的shufflenet unit不同。

ShuffleNet V2速度和准确率双赢的原因分析:

(1)每个block的高效允许使用更多的特征通道和更大的网络容量;

(2)在每个block中,特征channel的一半径直通过block,直接参与到下一个block中,可被看作一种feature reuse;

上述的(2)跟DenseNet和CondenseNet有异曲同工之妙。

原理差不多就是这些吧,若有不正确的地方,请大家指正,谢谢!

你可能感兴趣的:(轻量级网络)