本文收录了在ResNet之后出现的性能较好的深度学习网络,本篇侧重于针对移动端的网络,有:DenseNet、MobileNet、ShuffleNet和Ghost Net。大多数网络的目的都在针对移动端缩减计算量,给网络瘦身剪枝。本文只对这些网络的特点进行简要总结概括,具体网络的构成和实际实现应参考论文。

DenseNet

论文: Convolutional Networks with Dense Connectivity
代码: Caffe TensorFlow Pytorch

为了更好地利用特征,ResNet采取了特征重用,而DENSENET进一步进行了特征重用:对于一个DENSE BLOCK,一层的输入来自于之前所有层的输出的拼接。其中DENSE BLOCK每一层输出的通道数是固定不变的。

DENSENET还可以做两点优化来降维,一是DENSE BLOCK的每一层输入前都用1*1的卷积降维;二是两个DENSE BLOCK之间也用1*1的卷积降维。

这样即加深了网络,又减少了梯度消失的影响,还缩减了网络规模。

DenseNet

MobileNet V1

论文: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
代码: Caffe TensorFlow Pytorch

为了缩小网络规模应用于移动端,谷歌提出了MobileNet。

主要是利用了3*3的深度分离卷积加上一个1*1的普通卷积代替了原有的3*3的卷积。其中3*3的深度分离卷积为:对于一个特征,分离每个通道并分别用不同的卷积核卷积,得到的结果再合并。

这样做大大减少了计算量,同时还保证了一定的准确率。

MobileNet_V1

MobileNet V2

论文: MobileNetV2: Inverted Residuals and Linear Bottlenecks
代码: Caffe TensorFlow Pytorch

MobileNet V2与MobileNet V1的区别在于,

一是引入了残差模块,在3*3的深度分离卷积前加入了1*1的卷积,并把输入特征与输出特征合并;

二是最后一层激活函数改为线性。

MobileNet_V2

MobileNet V3

论文: Searching for MobileNetV3
代码: Caffe TensorFlow Pytorch

MobileNet V3在MobileNet V2上有四点改进:

一是在深度分离卷积到1*1的卷积之间加入SENET的SE结构;

二是修改了尾部结构,删去了尾部3*3和1*1的卷积,并把avg pooling提前到了1*1卷积之前;

三是在保证精度的情况下减小了通道的数目;

四是由于sigmoid在移动端耗时较长,改成了h-swish。

MobileNet_V3

ShuffleNet V1

论文: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
代码: Caffe TensorFlow Pytorch

类似于MobileNet V2,ShuffleNet V1也使用了带深度分离卷积的残差模块。虽然深度分离卷积减少了计算量,但是由于其忽视了不同通道的特征之间的联系,从而降低了特征提取能力。

为了解决这一问题,ShuffleNet V1在深度分离卷积之前进行了通道间均匀地打乱,并取消了深度分离卷积之后的激活函数ReLu,保证了不同通道之间的通信。

此外ShuffleNet V1还有一个降采样版本,残差模块中,原始特征经过一个步长为2的avg pooling,同时将深度分离卷积的步长也改为2,这样输出的时候残差的两个部分的大小是相同的,然后像DENSENET那样拼接合并而不是之前的简单相加。

ShuffleNet_V1

ShuffleNet V2

论文: ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
代码: Caffe TensorFlow Pytorch

ShffleNet V2与ShffleNet V1的主要区别在于把通道均匀打乱的步骤放在了残差拼接合并之后。

ShuffleNet V2有两个版本,第一个版本对输入特征进行了通道分割,这是为了尽量减少网络分支数,一般分割方式为均分;

第二个版本是降采样版本,取代ShffleNet V1降采样版本中的avg pooling,而改成一个步长为2的3*3深度分离卷积接上一个1*1普通卷积。

下图(a)和(b)为V1版本,(c)和(d)为V2版本。

ShuffleNet_V2

GhostNet

论文: GhostNet: More Features from Cheap Operations
代码: TensorFlow Pytorch

GhostNet同样针对于移动端,之前的MobileNet和ShuffleNet都依然使用了1*1的卷积增加了计算量。作者发现ResNet第一层残差网络的特征图中由很多相似通道,所以希望用简单的线性变换得到与原来的相似通道。

GhostNet由一个基础模块Ghost Model组成,Ghost Model首先用卷积提取一次特征,然后对于特征的每一个通道都进行一次简单的线性变换后与原特征进行拼接得到最终输出。

两个Ghost Model连接组成的残差结构作为一个Ghost BottleNeck,整体网络上GhostNet将MobileNet V3的每个BottleNet换成了Ghost BottleNeck并在部分Ghost Model中加入了SE模块。线性变换可采用仿射变换、小波变换,但目前由于硬件支持问题依然推荐采用卷积。

GhostNet