高效网络:Xception, MobileNet, MobileNet V2, ShuffleNet ,ShuffleNet V2
目录
一、参数数量和理论计算量
1、定义
- 参数数量(params):关系到模型大小,单位通常为M,通常参数用 float32 表示,所以模型大小是参数数量的 4 倍
- 理论计算量(FLOPs):
- 是 floating point operations 的缩写(注意 s 小写),可以用来衡量算法/模型的复杂度,这关系到算法速度,大模型的单位通常为 G,小模型单位通常为 M。
- 通常只考虑乘加操作(Multi-Adds)的数量,而且只考虑 CONV 和 FC 等参数层的计算量,忽略 BN 和PReLU 等等。一般情况,CONV 和 FC 层也会 忽略仅纯加操作 的计算量,如 bias 偏置加和 shotcut 残差加等,目前技术有 BN 的 CNN 可以不加 bias
2、计算公式
二、Xception
原文地址: Xception:Deep Learning with Depthwise Separable Convolutions
作者:François Chollet
Depthwise(DW)卷积与Pointwise(PW)卷积,合起来被称作Depthwise Separable Convolution(参见Google的Xception)
对于一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution首先经过第一次卷积运算,不同于上面的常规卷积,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),如下图所示
Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。如下图所示。
这两个步骤不起来被称为DepthWise convolution
这种操作是相当有效的,在imagenet 1000类分类任务中已经超过了InceptionV3的表现,而且也同时减少了大量的参数,我们来算一算,假设输入通道数为3,要求输出通道数为256,两种做法:
1.直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912
2.DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一!
因此,一个depthwise操作比标准的卷积操作降低不少的参数量,同时论文中指出这个模型得到了更好的分类效果。
三、MobileNetV1
MobileNets其实就是Exception思想的应用。区别就是Exception文章重点在提高精度,而MobileNets重点在压缩模型,同时保证精度。
四、MobileNetV2
五、ShuffleNet
这篇文章在mobileNet的基础上主要做了1点改进:
mobileNet只做了3*3卷积的deepwiseconvolution,而1*1的卷积还是传统的卷积方式,还存在大量冗余,ShuffleNet则在此基础上,将1*1卷积做了shuffle和group操作,实现了channel shuffle 和pointwise group convolution操作,最终使得速度和精度都比mobileNet有提升。
如下图所示,
(a)是原始的mobileNet的框架,各个group之间相互没有信息的交流。
(b)将feature map做了shuffle操作
(c)是经过channel shuffle之后的结果。
在图(a)中,每个group是互不影响的,所以最后得到的output也无法整合全部的input信息。(b)中,通过将每个group继续分配到每个卷积中,整合了所有group的信息,而不是单单的某个group。(c)是图(b)实现后的结果。
ShuffleNet Units 的结构如上图所示,
(a)是一个带depthwiseconvolution (DWConv)的bottleneck unit
(b)在(a)的基础上,进行了pointwisegroup convolution (GConv) and channel shuffle
(c)进行了AVG pooling和concat操作的最终ShuffleNetunit
六、ShuffleNet V2
论文指出单纯的乘加运算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的值最小。
(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
参考:
https://blog.csdn.net/tintinetmilou/article/details/81607721
https://blog.csdn.net/qq_14845119/article/details/73648100