Google在2017年上半年发表了一篇关于可以运行在手机等移动设备上的神经网络结构——MobileNets。MobileNets是基于深度可分离卷积(depthwise separable convolution)而设计的轻量级深度神经网络。这文章也介绍了两个超参数可以很好的平衡延时与精度,这两个超参数可以使人更方便地选出自己想要的网络结构。MobileNets的结构能用在图片分类、人脸识别、目标检测等上面。论文的mxnet代码已经开源,tensorflow的相关代码也开源了。

深度可分离卷积(depthwise separable convolution)

在上一篇博客中——ShuffleNet总结中已经说明过卷积的计算了,与这里卷积相关计算有一点不同的是:这论文中长度为\(n\)方阵计算的复杂度直接设为\(n^2\),而我在前一篇博客中设为\(n^3\),实际上能优化到\(n^{2.376}\),加上openmp等多核多线程技术,方阵计算复杂度为\(n^2\)是合理的。

论文中的主要的思想是将一个标准卷积(standard convolution)分解成两个卷积,一个是深度卷积(depthwise convolution),这个卷积应用在每一个输入通道上;另一个是\(1 \times 1\)的逐点卷积(pointwise convolution),这个卷积合并每一个深度卷积的输出。

分解

为什么标准卷积能分解,怎么分解?先来看下论文给出的分解方法。如图一所示:

图1 标准卷积的分解

事实上标准卷积的分解可以用矩阵乘法来理解。在上一篇博客中——ShuffleNet总结卷积的计算时,如果卷积核\(K\)为\(D_K \times D_K \times M \times N\),输入的\(D_F \times D_F \times M\)张量\(F\)(也叫Feature),输出的\(D_F \times D_F \times N\)张量\(G\)(这里都采用了论文中的符号,\(D_K\)为卷积核的长与宽,\(M\)是是输入的通道数,\(N\)输出通道数,\(D_F\)是Feature的长与宽),先要将\(F\)转换成一个\((M \times D_K \times D_K) \times (D_F \times D_F)\)矩阵(就是im2col),卷积核\(K\)转换为\(N \times(M \times D_K \times D_K)\)。

卷积核这个矩阵可以分解成两个矩阵\(DW\)与\(PW\)的乘积,其中\({DW}\)代表depthwise convolution,\({PW}\)代表pointwise convolution。\(DW\)的shape为如图1b)所示的\(M \times (1 \times D_k \times D_k)\),\(DP\)的shape为如图1c)所示的\(N \times (M \times 1 \times 1)\),所以这两个相乘的shape刚好是卷积核\(K\)的shape:
\[
K_{N \times(M \times D_K \times D_K)}={PW}_{N \times (M \times 1 \times 1)} \times {DW}_{M \times (1 \times D_k \times D_k)} \tag{1.1}
\]

标准卷积计算

可以证明分解出来的两个卷积核与一个标准卷积核是等价的。标准卷积下的计算方法以下:
\[
G_{N \times (D_F \times D_F)} = K_{N \times(M \times D_K \times D_K)} \times F_{(M \times D_K \times D_K) \times (D_F \times D_F)} \tag{1.2}
\]

分解后的计算

分解成两个卷积后,先与第一个卷积核\(DW\)卷积,由于这个卷积核作用于每一个输入的通道,实现上就是分组了,一共分成了M组,这个需要循环计算M次:
\[
{G1}_{M \times (D_F \times D_F)} = {DW}_{M \times(1 \times D_K \times D_K)} \times F_{(M/M \times D_K \times D_K) \times (D_F \times D_F)} \tag{1.3}
\]

得到的\({G1}\)再转换成一个\((M \times 1 \times 1) \times (D_F \times D_F)\)矩阵\({G2}\),再通过与\({PW}\)卷积可得:
\[
{G3}_{N \times (D_F \times D_F)} = {PW}_{N \times(M \times 1 \times 1)} \times {G2}_{(M \times 1 \times 1) \times (D_F \times D_F)} \tag{1.4}
\]

分解前后单元网络结构对比如图2所示:

图2 分解前后的对比图

计算复杂度

对于标准卷积来说,根据式(1.2)可以看到计算量为:
\[
Cost_{std} = D_K \times D_K \times M \times N \times D_F \times D_F \tag{1.5}
\]

对于分解后的卷积,根据式(1.3)与式(1.4)可以看到计算量为:
\[
Cost_{sep} = D_K \times D_K \times M \times D_F \times D_F + M \times N \times D_F \times D_F\tag{1.6}
\]

分解前后的计算量之比是:
\[
p = \frac{Cost_{sep}}{Cost_{std}} = \frac{1}{N} + \frac{1}{D_K^2} \tag{1.7}
\]

可以看到前后的计算量是小了很多的。

MobileNets结构

经过上面的说明可以看得MoblieNets的结构如图3所示:

图3 MobileNets的网络结构

两个超参数

这两个超参数也是相当容易理解的,一个是减小输出通道数\(N\),一个是减少输入图片的大小(退出是分辨率resolution)。

Width Multiplier \(\alpha\)

如果上面输出的通道数都是原来的\(\alpha\)倍,那么我们可以知道计算量由式(1.6)变为:
\[
Cost_{sep}^\alpha = D_K \times D_K \times \alpha M \times D_F \times D_F + \alpha M \times \alpha N \times D_F \times D_F\tag{1.8}
\]
由于\(D_K\)一般比\(N\)小很多,所以计算量与参数量都大约是\(\alpha =1\)(MobileNets的基准线)时的\(\alpha^2\)倍。\(\alpha\)一般取值为0.25,0.5,0.75和1。比如的结果如图4所示。

Resolution Multipliter \(\rho\)

这个用于控制输入图片的大小,输入的图片越小,后面的feature也会相于地变小,所以能减小计算量,但是并不能减小参数量,因为这个对于卷积核的大小没有影响,计算计算量由式(1.8)变为:
\[
Cost_{sep}^{\alpha\rho} = D_K \times D_K \times \alpha M \times \rho D_F \times \rho D_F + \alpha M \times \alpha N \times \rho D_F \times \rho D_F\tag{1.9}
\]

可以明显地看到,计算量为原来的\(\rho^2\)倍,如果以224大小为基准线,那么输入大小一般建议取为192、160与128。具体结果如图4所示。

图4 两个超参数对准确率、计算量与参数量的影响。

结语

MobileNets基以上面几种技术,训练出来的网络能很好地用于各类视觉任务,比如目标检测、分类等。

MobileNets总结的更多相关文章

  1. [论文阅读] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications (MobileNet)

    论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 本文提出的模型叫Mobi ...

  2. 论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)

    论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications MobileNet由Go ...

  3. 【网络结构】MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications论文解析

    目录 0. Paper link 1. Overview 2. Depthwise Separable Convolution 2.1 architecture 2.2 computational c ...

  4. 【论文翻译】MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文链接:https://arxi ...

  5. [论文理解] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications Intro MobileNet 我 ...

  6. 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

    from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...

  7. Paper | MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    目录 1. 故事 2. MobileNet 2.1 深度可分离卷积 2.2 网络结构 2.3 引入两个超参数 3. 实验 本文提出了一种轻量级结构MobileNets.其基础是深度可分离卷积操作. M ...

  8. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    1. 摘要 作者提出了一系列应用于移动和嵌入式视觉的称之为 MobileNets 的高效模型,这些模型采用深度可分离卷积来构建轻量级网络. 作者还引入了两个简单的全局超参数来有效地权衡时延和准确率,以 ...

  9. 深度学习论文翻译解析(六):MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications

    论文标题:MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications 论文作者:Andrew ...

随机推荐

  1. 【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新

    如题:         在写后台管理系统时,需要实现后台界面的局部动态刷新.         左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态 ...

  2. openstack学习心得:glance 架构、概念、后端存储配置方式

    glance 架构 glance 服务概述 Image 服务 使得用户可以发现.注册.检索虚拟机镜像.它对外提供REST API使得你能够查询虚拟机镜像元数据和检索一个真实的镜像.你可以通过镜像服务将 ...

  3. 你应该学会的Postman用法

    postman这个神器相信大家都用过,程序员作为非专业的测试人员,非常需要这么一款简单轻量级的restful测试工具,但是不知道你是否知道,postman的强大之处不只是测试一下接口,还有其他非常赞的 ...

  4. Python异步处理

    回调函数是实现异步操作的常用手法 1.callback版本的示例,其中framework调用logic,在完成某些操作或者接收到信号后,用callback返回异步结果 #!/usr/bin/env p ...

  5. FPGA时钟分频(转)

    http://www.cnblogs.com/fpga/archive/2009/10/24/1589318.html 占空比为50%的分频 偶数分频比较简单 比如N分频,那么计数到N/2-1,然后时 ...

  6. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

  7. app打包常用操作

    1.修改appId android:打开build.gradle文件 找到defaultConfig{applicationId 'ceshi'} 修改测试.android studio会提示. Gr ...

  8. 简单的OC程序

    知识点 1.#import的用途: 1> 跟#include一样,拷贝文件的内容 2> 可以自动防止文件的内容被重复拷贝 2.#import <Foundation/NSObjCRu ...

  9. 网页的居中显示,使用了margin、clear:both

    很久没写过页面了,现在写起来也觉得捡起来还是挺快的. 当时遇到了这样的问题,我有一个大的div包涵了整个网站,有网页头部,中部还有底部.头部就是一个标题,中部就是几张图片跟文字排版,结果左右两边的图片 ...

  10. 基于iframe的移动端嵌套

    需求描述 上上周接到了新的项目,移动端需要做一个底部有五个导航,点击不同的导航页面主体显示不同的页面,其中两个页面是自己做,而另外三个页面是引用另外三个网址,其中两个网址为内部项目,另外一个为外部(涉 ...