前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >轻量级神经网络系列——MobileNet V1

轻量级神经网络系列——MobileNet V1

作者头像
小草AI
发布2019-07-08 19:18:42
1.3K0
发布2019-07-08 19:18:42
举报

研究方向:物体识别,目标检测,研究轻量级网络中

自从2017年由谷歌公司提出,MobileNet可谓是轻量级网络中的Inception,经历了一代又一代的更新。成为了学习轻量级网络的必经之路。

MobileNet V1

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

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

收录:CVPR2017

2017年4月,谷歌提出MobileNetV1,这一专注于在移动设备上的轻量级神经网络。一直都有一个争议,说MobileNetV1怎么和Xception的网络block结构一样,都大量用到了深度可分离?

其实这里有个小插曲:MobileNetV1在arxiv.org上的介绍是:

可以看到MobileNetV1是在2017年4月才提交的v1版本,但是

Xception是早在2016年10月v1版本就提出来了。那么,真的是MobileNet“抄袭”了Xception吗?其实并不是的,在Xception v1版本论文当中有这样的一句话:

而这个Andew Howard是谁呢?没错,就是MobileNetV1的作者。而在Xception v3论文版本中,一句话就变成了:

真相只有一个:2016年6月,谷歌提出了MobileNetV1,由于各种原因当时没有挂上arxiv,一直到2017年4月才提交。好巧不巧,谷歌的另一团队,同时提出了Xception。所有才有了两个结构都是基于深度可分离卷积的相似争论。好了,键盘党们可以擦擦键盘休息休息了。废话说完,开始正文。

其实介绍MobileNetV1(以下简称V1)只有一句话,MobileNetV1就是把VGG中的标准卷积层换成深度可分离卷积就可以了。

那么,这个深度可分离卷积是什么?

深度可分离卷积

深度可分离卷积(depthwise separable convolution),根据史料记载,可追溯到2012年的论文Simplifying ConvNets for Fast Learning,作者提出了可分离卷积的概念(下图(a)):

Laurent Sifre博士2013年在谷歌实习期间,将可分离卷积拓展到了深度(depth),并且在他的博士论文Rigid-motion scattering for image classification中有详细的描写,感兴趣的同学可以去看看论文

可分离卷积主要有两种类型:空间可分离卷积和深度可分离卷积。

空间可分离

顾名思义,空间可分离就是将一个大的卷积核变成两个小的卷积核,比如将一个3×3的核分成一个3×1和一个1×3的核:

由于空间可分离卷积不在MobileNet的范围内,就不说了。

深度可分离卷积

深度可分离卷积就是将普通卷积拆分成为一个深度卷积和一个逐点卷积。

我们先来看一下标准的卷积操作:

输入一个12×12×3的一个输入特征图,经过5×5×3的卷积核卷积得到一个8×8×1的输出特征图。如果此时我们有256个特征图,我们将会得到一个8×8×256的输出特征图。

以上就是标准卷积做干的活。那深度卷积和逐点卷积呢?

深度卷积

与标准卷积网络不一样的是,我们将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。如上图:输入12×12×3的特征图,经过5×5×1×3的深度卷积之后,得到了8×8×3的输出特征图。输入个输出的维度是不变的3。这样就会有一个问题,通道数太少,特征图的维度太少,能获取到足够的有效信息吗?

逐点卷积

逐点卷积就是1×1卷积。主要作用就是对特征图进行升维和降维,如下图:

在深度卷积的过程中,我们得到了8×8×3的输出特征图,我们用256个1×1×3的卷积核对输入特征图进行卷积操作,输出的特征图和标准的卷积操作一样都是8×8×256了。

标准卷积与深度可分离卷积的过程对比如下:

为什么要深度可分离卷积?

这个问题很好回答,如果有一个方法能让你用更少的参数,更少的运算,但是能达到差的不是很多的结果,你会使用吗?

深度可分离卷积就是这样的一个方法。我们首先来计算一下标准卷积的参数量与计算量(只考虑MAdd):

标准卷积的参数量

卷积核的尺寸是Dk×Dk×M,一共有N个,所以标准卷积的参数量是:

标准卷积的计算量

卷积核的尺寸是Dk×Dk×M,一共有N个,每一个都要进行Dw×Dh次运算,所以标准卷积的计算量是:

标准卷积算完了,我们接下来计算深度可分离卷积的参数量和计算量:

深度可分离卷积的参数量

深度可分离卷积的参数量由深度卷积和逐点卷积两部分组成:

深度卷积的卷积核尺寸Dk×Dk×M;逐点卷积的卷积核尺寸为1×1×M,一共有N个,所以深度可分离卷积的参数量是:

深度可分离卷积的计算量

深度可分离卷积的计算量也是由深度卷积和逐点卷积两部分组成:

深度卷积的卷积核尺寸Dk×Dk×M,一共要做Dw×Dh次乘加运算;逐点卷积的卷积核尺寸为1×1×M,有N个,一共要做Dw×Dh次乘加运算,所以深度可分离卷积的计算量是:

总的来说:

可以参数数量和乘加操作的运算量均下降为原来的

我们通常所使用的是3×3的卷积核,也就是会下降到原来的九分之一到八分之一。

假设

输出为一个224×224×3的图像,VGG网络某层卷积输入的尺寸是112×112×64的特征图,卷积核为3×3×128,标准卷积的运算量是:

3×3×128×64×112×112=924844032

深度可分离卷积的运算量是:

3×3×64×112×112+128×64×112×112 = 109985792

这一层,MobileNetV1所采用的深度可分离卷积计算量与标准卷积计算量的比值为:

109985792 /924844032 = 0.1189

与我们所计算的九分之一到八分之一一致。

V1卷积层

上图左边是标准卷积层,右边是V1的卷积层,虚线处是不相同点。V1的卷积层,首先使用3×3的深度卷积提取特征,接着是一个BN层,随后是一个ReLU层,在之后就会逐点卷积,最后就是BN和ReLU了。这也很符合深度可分离卷积,将左边的标准卷积拆分成右边的一个深度卷积和一个逐点卷积。

等等,我们发现有什么东西混了进来???ReLU6是什么?

ReLU6

上图左边是普通的ReLU,对于大于0的值不进行处理,右边是ReLU6,当输入的值大于6的时候,返回6,relu6“具有一个边界”。作者认为ReLU6作为非线性激活函数,在低精度计算下具有更强的鲁棒性。(这里所说的“低精度”,我看到有人说不是指的float16,而是指的定点运算(fixed-point arithmetic))

现在就有一个问题,标准卷积核深度可分离卷积层到底对结果有什么样的影响呢?

上实验。

可以看到使用深度可分离卷积与标准卷积,参数和计算量能下降为后者的九分之一到八分之一左右。但是准确率只有下降极小的1%。

V1网络结构

MobileNet的网络结构如上图所示。首先是一个3x3的标准卷积,s2进行下采样。然后就是堆积深度可分离卷积,并且其中的部分深度卷积会利用s2进行下采样。然后采用平均池化层将feature变成1x1,根据预测类别大小加上全连接层,最后是一个softmax层。整个网络有28层,其中深度卷积层有13层。

实验结果

V1论文中还有一部分对V1网络再进行调整,在此就不赘述了,感兴趣的同学可以去看看原论文。

V1的效果到底好不好,作者将V1与大型网络GoogleNet和VGG16进行了比较:

可以发现,作为轻量级网络的V1在计算量小于GoogleNet,参数量差不多是在一个数量级的基础上,在分类效果上比GoogleNet还要好,这就是要得益于深度可分离卷积了。VGG16的计算量参数量比V1大了30倍,但是结果也仅仅只高了1%不到。

目标检测,在COCO数据集上的结果:

对了,作者还在论文中分析整个了网络的参数和计算量分布,如下图所示。可以看到整个计算量基本集中在1x1卷积上。对于参数也主要集中在1x1卷积,除此之外还有就是全连接层占了一部分参数。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与python集中营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档