MobileNets模型压缩

MobileNets,可以在基本不影响准确率的前提下大大减少计算时间和参数数量。

论文链接:https://arxiv.org/abs/1704.04861 

继AlexNet以来,VGG、GoogleNet、ResNet等网络向网络层数更深地方向发展,以寻求更好的检测精度。然而,在目前许多应用,如自动驾驶、疲劳检测、机器人等受限于集成设备与处理速度。模型压缩研究应运而生。

本文提出一种将传统的卷积结构改造成两层卷积结构的网络:MobileNets,采用类似ResNext里面的group操作来实现。这种新的结构可以在基本不影响准确率的前提下大大减少计算时间(约为原来的1/9)和参数数量(约为原来的1/7)。

算法详解:

MobileNet模型的核心:Depthwise Separable Convolution宽度可分离卷积,该网络削减网络宽度而不改变网络的深度。
所谓宽度可分离卷积就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的卷积(文中叫pointwise convolution)操作。其中depthwise convolution的每个filter都只跟input的每个channel进行卷积,而不将所有channels求和。pointwise convolution卷积层则负责combining,即将depthwise convolution卷积的结果进行合并。 
如下图:M表示输入特征的通道数,N表示输出特征的通道数(也是本层的卷积核个数)。因此如果假设卷积核大小是DK*DK*M*N,输出是DF*DF*N,那么标准卷积的计算量是DK*DK*M*N*DF*DF。这个式子可以这么理解,先去掉M*N,那么就变成一个二维卷积核去卷积一个二维输入feature map;那么如果输出feature map的尺寸是DF*DF,由于输出feature map的每个点都是由卷积操作生成的,而每卷积一次就会有DK*DK个计算量,因此一个二维卷积核去卷积一个二维输入feature map就有DF*DF*DK*DK个计算量;如果有M个输入feature map和N个卷积核,那么就会有DF*DF*DK*DK*M*N计算量。

这里写图片描述

本文的算法是用上图中的(b)+(c)代替(a),接下来详细讲解下什么怎么卷积的。依然假设有N个卷积核,每个卷积核维度是DK*DK*M,输入feature map的通道数是M,输出feature map为DF*DF*N。因此计算量是DF*DF*DK*DK*M。(b)生成的结果应该是DF*DF*M,图中的(b)表示的是卷积核的维度。

(c)表示用N个维度为1*1*M的卷积核卷积(b)的结果,即输入是DF*DF*M,最终得到DF*DF*N的feature map。这个就可以当做是普通的一个卷积过程了,所以计算量是DF*DF*1*1*M*N(联系下前面讲的标准卷积是DF*DF*DK*DK*M*N,就可以看出这个(c)其实就是卷积核为1*1的标准卷积)。

所以最重要的来了,采用这种算法的计算量变成了DF*DF*DK*DK*M+DF*DF*M*N。具体和原来相比减少了多少计算量?可以看下面这个式子:

这里写图片描述

也就是说如果卷积核大小为3*3,那么差不多卷积操作的时间能降到原来的1/9左右!

所以看看Fig3表达的标准卷积(左边)和因式分解后的卷积(右边)的差别。注意到卷积操作后都会跟一个Batchnorm和ReLU操作。

这里写图片描述

模型拓扑结构

这里写图片描述

实验结果

这个Table2介绍了网络中不同类型层的计算时间在总时间中的比例以及参数的数量在总的参数数量中的比例。

这里写图片描述

前面讲的都是在计算时间和参数的减少,现在看看计算准确率的对比:Table4,表示本文卷积和标准卷积的对比。可以看出Accuracy减少得不是很明显,但是却大大减少了计算时间和参数数量。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_38742161/article/details/86471725
今日推荐