深度学习——模型量化、压缩及加速( MobileNets )

参考:

              https://blog.csdn.net/u013082989/article/details/77970196

              https://blog.csdn.net/wfei101/article/details/78310226

V1—MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

论文地址:https://arxiv.org/abs/1704.04861

代码地址:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.py

1)具体原理及网络框架

1.1 deep-wise卷积

         MobileNet使用了一种称之为deep-wise的卷积方式来替代原有的传统3D卷积,减少了卷积核的冗余表达。在计算量和参数数量明显下降之后,卷积网络可以应用在更多的移动端平台。

                                                           

        传统的3D卷积使用一个和输入数据通道数相同的卷积核在逐个通道卷积后求和最后得出一个数值作为结果,假设M为输入的通道数,Dk为卷积核的宽和高,DF为输入的宽和高,在某一层如果使用N个卷积核。

该卷积层总体参数量为

                                                                DK×DK×N×M

该卷积层总体计算量为(考虑Padding,strides=1):

                                                                     

        如果使用deep-wise方式的卷积核,我们会首先使用一组二维的卷积核,也就是卷积核的通道数为1,每次只处理一个输入通道的,这一组二维卷积核的数量是和输入通道数相同的。在使用逐个通道卷积处理之后,再使用3D的1*1卷积核来处理之前输出的特征图,将最终输出通道数变为一个指定的数量。

参数总量为

                                                          DK×DK×M+N×M×1×1

则总体计算量为

                                         

        deep-wise方式的卷积相比于传统3D卷积计算量为:

             

 

1.2 网络结构

         传统的3D卷积常见的使用方式如下图左侧所示,deep-wise卷积的使用方式如下图右边所示。

                                           

                                                

        从图中可以看出,deep-wise的卷积和后面的1x1卷积被当成了两个独立的模块,都在输出结果的部分加入了Batch Normalization和非线性激活单元。

V2—Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation

论文地址:https://arxiv.org/abs/1801.04381

代码地址:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_v2.py

MobileNetV2是对MobileNetV1的改进,同样是一个轻量化卷积神经网络。

1)MobileNetV1遗留的问题

1、结构问题:

MobileNet V1 的结构其实非常简单,论文里是一个非常复古的直筒结构,类似于VGG一样。这种结构的性价比其实不高,后续一系列的 ResNet, DenseNet 等结构已经证明通过复用图像特征,使用 Concat/Eltwise+ 等操作进行融合,能极大提升网络的性价比。

2、Depthwise Convolution的潜在问题:

Depthwise Conv确实是大大降低了计算量,而且N×N Depthwise +1×1PointWise的结构在性能上也能接近N×N Conv。在实际使用的时候,我们发现Depthwise部分的kernel比较容易训废掉:训练完之后发现Depthwise训出来的kernel有不少是空的。当时我们认为,Depthwise每个kernel dim相对于普通Conv要小得多,过小的kernel_dim, 加上ReLU的激活影响下,使得神经元输出很容易变为0,所以就学废了。ReLU对于0的输出的梯度为0,所以一旦陷入0输出,就没法恢复了。我们还发现,这个问题在定点化低精度训练的时候会进一步放大。

2)MobileNetV2的创新点:

1. Inverted residuals block

        原始的ResNet Block,先用1x1降通道过ReLU,再3x3空间卷积过ReLU,再用1x1卷积过ReLU恢复通道,并和输入相加。之所以要1x1卷积降通道,是为了减少计算量,不然中间的3x3空间卷积计算量太大。所以Residual block是沙漏形,两边宽中间窄。Inverted Residual Block 先通过1x1卷积提升通道数,再Depthwise的3x3空间卷积,再用1x1卷积降低维度。两端的通道数都很小,所以1x1卷积升通道或降通道计算量都并不大,而中间通道数虽然多,但是Depthwise 的卷积计算量也不大。

                                                    

2.Linear bottlenecks

        MobileNet V1 里面使用 ReLU6,ReLU6 就是普通的ReLU但是限制最大输出值为 6,这是为了在移动端设备 float16/int8 的低精度的时候,也能有很好的数值分辨率,如果对 ReLU 的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16/int8无法很好地精确描述如此大范围的数值,带来精度损失。

        MobileNet V2为了避免Relu对特征的破坏,在residual block的Eltwise sum之前的那个使维度缩减 1*1 Conv 不再采用Relu。理由是:ReLU 变换后保留非0区域对应于一个线性变换,仅当输入低维时ReLU 能保留所有完整信息。

3) 网络结构

                                                                          

                                                

MobileNet应用项目

1) MobileNet-SSD : 

https://github.com/weiliu89/caffe/tree/ssd

https://github.com/chuanqi305/MobileNet-SSD

https://github.com/zeusees/Mobilenet-SSD-License-Plate-Detection

mobilenet_ssd caffe模型可视化网址:http://ethereon.github.io/netscope/#/gist/5b1ffa5d22f6ac1f25f30fbd24a716be

2) MobileNet-Mask RCNN:

https://github.com/matterport/Mask_RCNN

https://github.com/chrispolo/Mobilenet-_v1-Mask-RCNN-for-detection

猜你喜欢

转载自blog.csdn.net/aluomeiyouerror/article/details/85330290