本文介绍 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用起来,看看实际应用场景下的表现如何。