ShuffleNet V1是Face++于2017年提出的轻量级深层神经网络。作者在2018年又提出了基于V1版本改进的ShuffleNet V2版本。ShuffleNet V1中的核心思想为group结合shuffle操作来改进传统的ResNet的block。而ShuffleNet V2则根据相同的FLOPs(float-point operations,乘积数量)情况下模型速度差别仍然很大这一现象,指出内存访问损失时间和FLOPS共同决定了网络在实际落地时训练和运行的速度。最终通过实验说明了 卷积层输入输出通道数、group操作数、网络模型分支数以及Elementwise操作数,这四个因素对最终模型速度的影响。ShuffleNet V2根据上述实验结合V1中block的架构对网络结构做出了一定的改进,提升了模型实际引用时的速度。
ShuffleNet V1论文地址:https://arxiv.org/abs/1707.01083
ShuffleNet V2论文地址:https://arxiv.org/abs/1807.11164
ShuffleNet V1/V2代码(caffe):https://github.com/farmingyard/ShuffleNet
ShuffleNet V1代码(Tensorflow):https://github.com/MG2033/ShuffleNet
ShuffleNet V1代码(Pytorch):https://github.com/jaxony/ShuffleNet
ShuffleNet V2代码(Pytorch):https://github.com/miaow1988/ShuffleNet_V2_pytorch_caffe
2.ShuffleNet V1
(1)网络结构
ShuffleNet V1论文总体结构图如下,核心思想为group结合shuffle操作来改进传统的ResNet的block。正是这种结构实现了在不降低网络性能的前提下减少网络参数和计算量。
简单的对上述结构图做下解释。ShuffleNet V1和ResNet结构相对类似,主要有3个stage,各个stage中的那个1对应的结构如下图。各个stage中的3,7,3就是本文提出的shuffle block的个数。而上图中还给出了不同的group参数所对应的通道数。关于group的含义在下面的shuffle block的介绍中详细说明。
(2)shuffle block
接下来通过图文并茂的策略来阐述shuffle block结构是如何实现的。如下图所示,整个block首先通过如下图所示的group操作减少网络参数,并对group操作后输出的特征图作shuffle操作,用以消除由于group造成的特征屏蔽现象,紧接着再跟一个group操作。
如下图所示,展示了group操作以及shuffle操作的简单示意。
最后入下图所示的结构,我们可以发现shufflenet中group操作都是作用于1*1卷积操作中,论文中称之为pointwise group Convolutions。下图的两种结构对应了上述中体结构图中(红框部分)的1和3(7)部分。这两种结构右边结构可以缩小一半的特征图,右边的结构特征图大小不变。
(3)实验结论
首先作者通过实验证明不同group和不同倍数通道情况下的计算量以及分类误差结果。需要注意的是乘1状态下就是整体结构中的通道数。
如下图所示,作者证明了shuffle操作确实有功能。
如下图所示,对比了在相同计算量的情况下,不同网络于shufflenet分类误差的对比。
如下图所示,对比了不同状态下shufflenet和mobilenet的结果对比。
如下图所示,比较了和shufflenet在基本相同分类结果下的计算量的对比。
如下图所示,比较了shufflenet和mobilenet在目标检测数据集coco上的效果。
如下图所示,比较了不同输入尺寸下各个网络的计算量和计算时间。
3.ShuffleNet V2
ShuffleNet V2则根据相同的FLOPs(float-point operations,乘积数量)情况下模型速度差别仍然很大这一现象,指出内存访问损失时间(MAC)和FLOPS共同决定了网络在实际落地时训练和运行的速度。FLOPS和参数量有关可以通过网络结构直接得知,但内存访问损失时间难以得知,因此本文最终通过实验说明了 卷积层输入输出通道数、group操作数、网络模型分支数以及Elementwise操作数,这四个因素对内存访问损失时间(MAC)的影响。ShuffleNet V2根据上述实验结果,结合V1中block的架构对网络结构做出了一定的改进,提升了模型实际应用时的速度。
(1)四个实验
1.卷积层输入输出通道数对MAC的影响
最终的结论为:卷积层的输入和输出特征通道数相等时MAC最小,此时模型速度最快。
2.group操作数对MAC的影响
最终的结论为:过多的group操作会增大MAC,从而使模型速度变慢。
3.网络模型分支数对MAC的影响
最终的结论为:模型中的分支数量越少,模型速度越快。
4.Elementwise操作数对MAC的影响
Elementwise操作所带来的时间消耗远比在FLOPs上的体现的数值要多,因此要尽可能减少Elementwise操作。
根据上述四个实验得到的结论,相应的对ShuffleNet V1做出对应的改进来设计网络结构,也就是ShuffleNet v2。
(2)网络结构
ShuffleNet V2的整体结构图如下,可以看出其和ShuffleNet V1差别不大,因为其整体结构没有改变,改变的是block的设计。
(3)ShuffleNet V2 block
如下图所示,图a,b展示的是ShuffleNet V1的两种block示意图。而图c对应了基于上述实验分别对图a,b中的结构的改进。图d多增加了一个depthwise卷积,有助于增加感受野。
改进点1:利用channel split对输入通道对半分。因为实验一种提到输入输出相同MAC最小。
改进点2:利用channel split替换了group操作。因为实验二中提到group越少MAC越小。
改进点3:将shuffle移到了concat之后。因为实验三提到分支越少MAC越小。(且第一个1*1卷积后没有group,shuffle确实不是必须的)
改进点4:去掉Elementwise改成concat。因为实验四种提到Elementwise越少MAC越小。(且此时经过split正好可以concat)
(4)实验结果
如下表所示是先有的模型在速度、效果、FLOPs上的详细对比。
Note:实验中不少结果都和前面几点发现吻合,比如MobileNet v1速度较快,很大一部分原因是因为简单的网络结构,没有太多复杂的支路结构;IGCV2和IGCV3因为group操作较多,所以整体速度较慢;最后的几个通过自动搜索构建的网络结构,和前面的第3点发现对应,因为支路较多,所以速度较慢。 (引自网络)
在目标检测实验coco数据集中的速度,map的结果对比。如下图中的带星号的ShuffleNet V2代表的是在1*1卷积层前增加一个3*3的depthwise卷积层。