ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
论文指出单纯的乘加运算FLOPs并不能完全表示模型的运算速度,访存开销memory access cost(MAC)也应该考虑进去。并基于这,设计出了轻量化网络ShuffleNet V2。
提出了4个改进的原则:
(1)单个模块的输入输出通道相同,可以最小化访存开销(MAC)
c1:输入通道数
c2:输出通道数
h,w:输入feature map 的高度,宽度
B:FLOPs数,就是计算量,这里假设B恒定,卷积为1*1卷积(pointwise convolution ),因此计算量就是hwc1c2
MAC:访存次数,包括从内存取输入的feature map 的次数hwc1,将结果写回去的次数hwc2,取1*1卷积核参数的次数1*1*c1*c2
假设FLOPs数B恒定,c1*c2乘积一定的条件下,c1==c2可以使得c1+c2的值最小。
得出结论,当c1:c2=1:1时,可以获得最小的访存次数,使得网络运行速度提升。
(2)过量使用组卷积group convolution ,会增加MAC
g:组卷积的group个数
B:FLOPs数,由于这里使用的是组卷积,因此要除g
MAC:访存次数,从MAC公式可以看出,g越大,MAC值越大
(3)网络的分支越多,并行度越差
网络碎片化会降低并行度 一些网络如Inception,以及Auto ML自动产生的网络NASNET-A,它们倾向于采用“多路”结构,即存在一个lock中很多不同的小卷积或者pooling,这很容易造成网络碎片化,减低模型的并行度,相应速度会慢
(4)Element-wise 操作的时间是不可忽略的
像ReLU, AddTensor, AddBias 这些操作,虽然具有比较小的FlOPs数,但是却有比较大的访存MAC
最终结论:
- 使用平衡的卷积,(相同的输入,输出通道数)
- 组卷积的group数要谨慎设计
- 减少网络的并行度,减少碎片化
- 减少Element-wise 操作
网络模块:
前2个模块为ShuffleNet V1中的模块,(a)为传统模块,(b)为下采样模块
后2个模块为ShuffleNet V2中的模块,(c)为传统模块,(d)为下采样模块
V2和V1模块设计的区别:
- v2中的传统模块增加了channel split,假设原始输入通道数为c,将通道分成了c-c’和c’两个通道,实验中,c’=c/2
- 将channle shuffle操作移到后面来做
- 传统模块中将add操作转化为concat操作,有助于增加信息量,减少运算量
- 将Group conv换成了普通的conv,可以减少group数,减少MAC
网络结构:
论文实验:
分类任务精度:
ShuffleNet v2 ≥MobileNet v2 > ShuffeNet v1 > Xception
检测任务精度:
ShuffleNet v2 > Xception ≥ ShuffleNet v1 ≥ MobileNet v2