MobileNetV2,DenseNet,ShuffleNet几种轻量网络性能对比
本文介绍 MobileNetV2,DenseNet,ShuffleNet几种轻量网络性能对比
MobileNetV2,DenseNet,ShuffleNet几种轻量网络性能对比
This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat:
jintianiloveu
这篇文章简要的对比一下常用的轻量网络之间的性能差别。在本文发表的时候,ShuffelNet都已经有V2版本了。总的来说,不对比Mobilenetv1, shuffelnet是在mobilenetv1版本上的改进,其实就是添加了一个group convolution,而Mobilenetv2是在v1的版本基础之上,先从网络结构加速的MobileNetv1开始说起。
MobileNetV1
在v1,版本,最简单直接的两个操作就是深度优化的卷积滤波器,以及点优化的卷积,听起来牛逼,实际上insights就两个:
- depth-wise 的filter,以前都是直接进行卷积运算,对每一个通道进行比如3x3卷积运算,现在是先进行resize,先降低尺度,然后在使用1x1卷积进行通道扩充。
- 1x1卷积的提出,说白了就是扩充通道,不改变尺度。
好像就这两个东西,那么v2版本有啥提升呢?先不说v2,根据网络的前后顺序,接下来说一下shufflenet。
ShuffleNetV1
其实shuffelnetv1说实话,就是在mobilenetv1基础上,加了一个group操作。关于这个Group卷积,在之前我有过一篇文章详细论述。其实就是将整个channel,拆分为几组,分别进行卷及计算,而ShuffleNet在group之间进行了一个打乱的操作,提升了特征的融合性能。
MobileNetV2
在MobileNetV2中,最重要的就是反向残差,Inverted Residual, 这个是在v1中没有的,另外一个是线性瓶颈,Linear Bottlenecks, 对于反向残差,其实没有设么好理解的,就是将ResidualNet中的残差连接方式,进行了反向。线性的瓶颈,这个线性瓶颈到底起来什么作用,其实有点像采用这个东西,代替了ReLU。此处似乎需要思考一个问题:为什么卷积要用ReLU 作为激活函数?为什么呢?
ShuffleNet V2
这是ShuffleNet的第二个版本。这个论文分析了,通过FLOPS来衡量一个网络计算速度的指标是不可学得,原因是,卷积运算在不同的平台都有不同的优化的,比如CUDA可以并行计算多个卷积操作,其中这个FLOPS还只是包含了浮点数的计算时间,类似的内存访问损失似乎没有加入进来。于是这篇论文给出了设计高速轻量网络的几条guidelines:
- 卷积操作,输入输出channel一致可以使得内存访问成本最低;
- 过度的群卷积会增加mac访问成本;
- 网络的碎片化会降低网络的并行度;
- 元素级运算,比如add,relu,虽然其flops几乎没有,但是它的内存访问时间不忽略
然后根据以上四条准则,设计除了shufflenetv2的结构:
也就是做到:1) 保证每个conv输入channels和输出channels数量一致,没有使用群卷积,采用channels split操作,最后连接没有采用add和relu,而是concat,降低mac消耗。可以看到ShuffleNetV2在速度和精度上,似乎都比MobileNetV2要强。尤其是在ARM上的运行速度,很快。
总结
最后总结一下,这些轻量级的网络中,似乎最后ShuffleNetV2是最先进的,它几乎融合了各家特长,并且将速度做到了极致。有时间得把ShuffelNetV2用起来,看看实际应用场景下的表现如何。
- 原文作者:金天
- 原文链接:https://jintian93.github.io/post/2019_01_09_11_MobileNetV2DenseNetShuffleNet%E5%87%A0%E7%A7%8D%E8%BD%BB%E9%87%8F%E7%BD%91%E7%BB%9C%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。