MobileNet v1、v2

1、MobileNet v1(2017.4 arXiv)

(1)网络结构

    MobileNet v1的网络结构非常简单,它是一个类似于VGG那样的直通网络,没有跳跃连接。MobileNet v1的主要贡献就是提出用深度可分离卷积代替普通卷积,它的整个网络大部分是基于深度可分离卷积的,只有网络前面几层使用普通卷积,整个网络参数比GoogLeNet小2.5倍,但是准确率比GoogLeNet高。普通卷积深度可分离卷积的区别如下(注意这里的深度可分离卷积的3*3的卷积和1*1的卷积都跟了一个激活函数ReLU):

                                   MobileNet v1、v2_第1张图片

    如果卷积核大小为3*3的话,深度可分离卷积的参数通常是标准卷积的8--9分之一。整个网络的结构如下:

                                       MobileNet v1、v2_第2张图片

    此外,MobileNet引入了两个超参数,分别是宽度乘子分辨率乘子来权衡准确率和时延,宽度乘子可以用于减小所有特征图通道数,而分辨率乘子可以用来减小特征图的分辨率。这里的设置为0.25、0.5、0.75、1.0的得到四个模型:MobileNet025、MobileNet050、MobileNet075、MobileNet010。这里的分辨率选择设置为:{ 224, 192, 160, 128 }

(2)实验结果

                                            MobileNet v1、v2_第3张图片 

                                            MobileNet v1、v2_第4张图片

    Table.4比较了深度可分离卷积核标准卷积的,将标准卷积换成深度可分离卷积之后,参数大大减少,但是准确率只轻微下降。Table.5表明,让MobileNet变得更细(即MobileNet075)比让它变得更浅(即把14*14*512的特征图部分删掉)的效果更好。Table.6比较了不同宽度乘子下的MobileNet的性能。Table.7比较了不同分辨率下MobileNet的性能。Table.8Table.9比较了MobileNet和其它模型的性能对比,包括准确率和参数。

(3)参考

  MobileNet v1的官方源码:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.py

  MobileNet v1的预训练模型:https://github.com/tensorflow/models/tree/master/research/slim

  论文参考:《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》

2、MobileNet v2(CVPR2018)

(1)网络结构

    从MobileNet v1的结构可以看出,它并没有使用ResNet的skip connection以及DenseNet的特征图重用的牛逼的Trick,所以提升空间是还有很大的,而MobileNet v2就是这些Trick的集大成者,不知道Goole后面还会不会提出更厉害的v3、v4,我等吃瓜群众拭目以待呀。MobileNet v2的主要贡献是在MobileNet v1的基础上提出了线性瓶颈层(Linear Bottlenecks)反转残差块(Inverted Residuals)

    首先论文提出,对于输入的真实图像集合,我们说各个网络层的激活值构成了一个“兴趣流形“(manifold of interest)。一直以来我们认为这个"兴趣流形"可以被嵌入到低维的子空间中。换句话说,当我们看卷积层的所有单个d通道像素时,在这些值中编码的信息实际上位于某些流形中,而这些流形又可嵌入到低维子空间中。什么意思呢?也就是说实际中的兴趣流形并不是D-channel的所有信息,只是一个它的一个低维子空间。基于这个事实,看上去只需要我们减少特征图的维度即可,在MobileNet v1中通过引入一个宽度乘子进行了这种研究。基于MobileNet v1,只要我们减少特征图的维度直到"兴趣流行"充满整个特征图即可。然而,由于卷积网络中有一个激活层(比如ReLU),这就这种简单的减少特征图维度会有问题,因为ReLU的存在会导致通道的大部分信息丢失。然而如果通道很多的话就不会有问题,因为就算某个通道的信息丢失,但是其它通道也会保存。论文中也指出,如果想让ReLU对低通道的特征图转换之后不丢失信息的话,将会带来非常大的复杂度。此外,我们也很容易看到,如果ReLU后的结果都是非零值,那么ReLU的作用就相当于一个线性变换。换句话说,对于ReLU输出域中的那些非零值,神经网络只具有线性分类器的能力。总结而言说明了两个事实:1)如果在经过ReLU变换后“兴趣流形”为非零值,那么这个ReLU对应一个线性变换;2)ReLU是可以保存完整的输入流形的信息的,只要输入流形位于输入空间的低纬度子空间。通俗来讲,就是要想提升效果,维度是要降的,但channel数较低时通过relu层会有相对高的概率使较多的输出为0,要想不为0,就要使用relu的线性部分,那么这就相当于接了个线性分类器了。基于这两个事实,论文提出,对于低维的“兴趣流形”输入,可以在卷积块中插入线性瓶颈来捕获。即将深度可分离卷积中1*1卷积后的ReLU变成线性变换:DepthConv(3*3) + BN + ReLU + Conv(1*1) + BN + linear。

    此外,可以看出深度可分离卷积核残差块非常相似,因此论文把深度可分离卷积融合到残差块中。与普通的残差块相比,普通残差块是中间窄,两边宽,深度可分离卷积的反转残差块是两边窄中间宽,因为中间采用深度可分离卷积,所以非常节省参数。如下图所示,左图为普通残差块,右图为反转残差块。

    MobileNet v1、v2_第5张图片     MobileNet v1、v2_第6张图片

    反转残差块的通道设定如下,s表示卷积步长,卷积核尺寸为3*3t表示扩张因子:

                                 MobileNet v1、v2_第7张图片

    因此MobileNet v2的一个Bottleneck为(左图为MobileNet v1,右图为MobileNet v2):

          MobileNet v1、v2_第8张图片                      MobileNet v1、v2_第9张图片

    整体网络结构如下,t表示扩张因子,c表示输出的通道数,n表示该Bottleneck重复的次数,s表示卷积的步长(每一行所表示的许多网络层中,第一层的卷积步长为s,其它层卷积步长为1),卷积尺寸为3*3,网络的第一层为32个卷积核的普通卷积,接下来是residual bottleneck,使用ReLU6作为激活函数,因为它的鲁棒性很好,在训练时也使用了DropoutBN进行正则化:

                                MobileNet v1、v2_第10张图片             

(2)在ImageNet上的实验结果:

                              MobileNet v1、v2_第11张图片     

    实验中也使用了MobileNet v1中使用的宽度乘子和分辨率乘子,宽度乘子为{0.35,0.5,0.75,1.0,1.4},分辨率乘子为{96,128,160,192,224},实验结果如下图,横坐标代表特征图宽度(即通道数),纵坐标代表准确率:

                     MobileNet v1、v2_第12张图片      

(3)参考

  MobileNet v2的官方源码:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_v2.py

  MobileNet v2的预训练模型:https://github.com/tensorflow/models/tree/master/research/slim

  论文参考:《MobileNetV2: Inverted Residuals and Linear Bottlenecks》

你可能感兴趣的:(Classification,Networks)