MobileNets采用了一种新颖的卷积方式depthwise separable convolutions,相比于传统卷积方法,depthwise separable convolutions能大幅度的减少运算量,从而减少模型的大小。

\"\"

 

                            图1 传统卷积核

    \"\"  

                         图2 depthwise convolutional filters

\"\"

                    图3 Pointwise Convolution

   

传统的卷积方式如图1所示,我们假设输入的特征图形状为Df * Df * M,卷积核kernel的大小为Dk*Dk,卷积核的个数为N,当进行卷积操作时,默认卷积核的深度与输入特征图的深度保持一致,从而通过卷积打通各通道以及平面上相邻区域来提取特征。对于一次传统的卷积过程,总运算量是

Dk * Dk * M * N * Df * Df

深度可分离卷积depthwise separable convolutions由深度方向的depthwise convolutions和pointwise convolutions两层组成,分别从深度和平面点两个方向对原始输入特征图Df * Df * M进行卷积。对于深度方向depthwise convolutions,使用的卷积核形状为Dk * Dk *1,使用M个卷积核分别遍历每个通道的数据,这一过程所产生的运算量:

Dk * Dk * 1 * M * Df * Df

由于单通道上的特征远远无法满足特征的要求,因此需要打通特征图的各通道,利用通道之间的联系提取新的特征。对depth convlutions卷积后的特征图谱,在平面点方向上使用pointwise convolutions,即卷积核形状为1 * 1 *M,卷积核个数为N,那么这一过程所产生的运算量:

1* 1* M * N * Df * Df

深度可分离卷积总运算量:

M * Df * Df * (Dk * Dk + N)

相比于传统卷积方式,深度可分离卷积运算量是传统卷积运算量的(1/N+1/ Dk2),举一个具体的例子,给定输入图像的为3通道的224x224的图像,VGG16网络的第3个卷积层conv2_1输入的是尺寸为112的特征图,通道数为64,卷积核尺寸为3,卷积核个数为128,深度可分离卷积运算量是传统卷积的0.1189倍。由此看来,这种深度可分离卷积方式大大减少了运算量,从而有利于提升模型的运算速度。

2、MobileNets 代码复现

2.1 数据集加载

本文采用CIFAR-10数据集,并将其转换成tensorflow官方推荐的标准格式tfrecord的格式进行数据集的读写,这种数据记载的方式能高效的实现数据读取。

图4 tfrecord数据集读取

2.2  模型搭建

本文利用tensorflow 支持的slim库包搭建MobileNet神经网络,除了常规的卷积以外,slim还支持深度可分离卷积slim.separable_conv2d,通过这种方式可以很好的避免tf.nn.depthwise_conv2d( )方法里复杂的参数设置,快速搭建MobielNet网络原型。

图5 模型搭建

​​​​​​​2.3  训练与测试

CIFAR-10数据集解决的是一个分类问题,因此将交叉熵cross_entropy作为损失函数,如图6所示,这中损失函数能很好的避免训练过程中出现梯度弥散的现象。

图6 交叉熵cross_entropy损失函数

3、MobileNets_v2 对MobileNet的改进

相比于MobileNet,其v2版本在网络结构上进行了一些改进,总结如下: 首先是加入了bottleneck,从而进一步缩小了模型的参数量,并且采用先升维后降维的方法做bottleneck,实验证明效果更好;

其次,当维度增加以后,进行Relu操作,而当维度下降以后,取消relu操作,这是因为当维度很多时,对特征的表达能力较强,甚至有可能出现不同维度表示的是统一特征的信息,因此使用Relu在减少计算量的同时,不会对模型的精度造成影响,另一方面,当维度很少时,Relu的使用会武断的去掉一部分有用特征表述,从而造成特征丢失。

收藏 打印