一、论文:

https://arxiv.org/abs/18

转载自https://blog.csdn.net/kangdi7547/article/details/8143157

二、论文理解

MobileNet V2 是对 MobileNet V1 的改进,同样是一个轻量级卷积神经网络。

1)基础理论--深度可分离卷积(DepthWise操作)

标准的卷积过程可以看上图,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?

Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps 进行标准的1×1跨通道卷积操作。这种操作被称为“DepthWise convolution”,缩写“DW”。

这种操作是相当有效的,在 ImageNet 1000 类分类任务中已经超过了InceptionV3 的表现,而且也同时减少了大量的参数,我们来算一算,假设输入通道数为3,要求输出通道数为256,两种做法:

1. 直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912

2. DW 操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一!

因此,一个 Depthwise 操作比标准的卷积操作降低不少的参数量,同时论文中指出这个模型得到了更好的分类效果。

2)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输出,就没法恢复了。我们还发现,这个问题在定点化低精度训练的时候会进一步放大。

3MobileNet V2的创新点

1、Inverted Residual Block

MobileNet V1没有很好的利用Residual Connection,而Residual Connection通常情况下总是好的,所以MobileNet V2加上。先看看原始的ResNet Block长什么样,下图左边:

先用1x1降通道过ReLU,再3x3空间卷积过ReLU,再用1x1卷积过ReLU恢复通道,并和输入相加。之所以要1x1卷积降通道,是为了减少计算量,不然中间的3x3空间卷积计算量太大。所以Residual block是沙漏形,两边宽中间窄。

但是,现在我们中间的3x3卷积变为了Depthwise的了,计算量很少了,所以通道可以多一点,效果更好,所以通过1x1卷积先提升通道数,再Depthwise的3x3空间卷积,再用1x1卷积降低维度。两端的通道数都很小,所以1x1卷积升通道或降通道计算量都并不大,而中间通道数虽然多,但是Depthwise 的卷积计算量也不大。作者称之为Inverted Residual Block,两边窄中间宽,像柳叶,较小的计算量得到较好的性能。

2、ReLU6

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

本文提出,最后输出的 ReLU6 去掉,直接线性输出,理由是:ReLU 变换后保留非0区域对应于一个线性变换,仅当输入低维时ReLU 能保留所有完整信息。

在看 MobileNet V1的时候,我就疑问为什么没有把后面的 ReLU去掉,因为Xception已经实验证明了 Depthwise 卷积后再加ReLU 效果会变差,作者猜想可能是 Depthwise 输出太浅了, 应用 ReLU会带来信息丢失,而 MobileNet V1还引用了 Xception 的论文,但是在 Depthwise 卷积后面还是加了ReLU。在 MobileNet V2 这个 ReLU终于去掉了,并用了大量的篇幅来说明为什么要去掉。

总之,去掉最后那个 ReLU,效果更好。

4 网络结构

这样,我们就得到 MobileNet V2的基本结构了,左边是 V1 的没有 Residual Connection并且带最后的 ReLU,右边是 V2 的带Residual Connection 并且去掉了最后的 ReLU:

网络的整体配置清单如下:

其中:

t  是输入通道的倍增系数(即中间部分的通道数是输入通道数的多少倍)

是该模块重复次数

c 是输出通道数

s 是该模块第一次重复时的 stride(后面重复都是 stride 1)

5 实验结果

通过 Inverted residual block这个新的结构,可以用较少的运算量得到较高的精度,适用于移动端的需求,在 ImageNet 上的准确率如下所示:

可以说是又小又快又好。另外,应用在目标检测任务上,也能得到很好的效果。

应用在目标检测任务上,基于 MobileNet V2的SSDLite 在 COCO 数据集上超过了 YOLO v2,并且大小小10倍速度快20倍:

6 总结

1、CNN 在 CV 领域不断突破,但是深度模型前端化还远远不够。目前 MobileNet、ShuffleNet参数个位数(单位 M ),在ImageNet 数据集上,依 top-1 而论,比 ResNet-34,VGG19 精度高,比 ResNet-50 精度低。实时性和精度得到较好的平衡。

2、本文最难理解的其实是 Linear Bottlenecks,论文中用了很多公式来描述这个思想,但是实现上非常简单,就是在 MobileNet V2 微结构中第二个PW后去掉 ReLU6。对于低维空间而言,进行线性映射会保存特征,而非线性映射会破坏特征。

三、参考博客

MobileNet V2的Caffe模型:https://github.com/shicai/MobileNet-Caffe

Depthwise Convolutional Layer: github.com/yonghenglh6/DepthwiseConvolution

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

MobileNet V2 模型分析+解读相关推荐

  1. MobileNet V2 论文笔记

    论文:Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segm ...

  2. 轻量化神经网络总结:SqueezeNet、Xception、MobileNet v1、MobileNet v2、ShuffleNet v1、ShuffleNet v2

    2016.02 伯克利&斯坦福提出 SqueezeNet 在ImageNet上实现了与Alexnet相似的效果,参数只有其1/50 核心点: 1x1卷积核代替3x3卷积核 Squeeze La ...

  3. 基于轻量级神经网络MobileNet V2的水果识别种类算法研究

    基于轻量级神经网络MobileNet V2的水果识别种类算法研究 时代背景 农用机器人,是由现代农业中发展出来的一个能够部分取代人类劳动力的高智能精密机械装置.它是现代农业生产中不能缺少的环节,也是未 ...

  4. 论文笔记:MobileNet v2

    原论文:MobileNetV2: Inverted Residuals and Linear Bottlenecks MobileNet v2 1.四个问题 要解决什么问题? 与MobileNet v ...

  5. MobileNet V2 复现

    MobileNet V2 复现 Windows 10 python 3.7.6 tensorflow 2.1 cuda 10.2 模型文件 model.py # -*- coding:utf-8 _* ...

  6. MobileNet V2简单总结

    2017_MobileNetV2_谷歌: 图: 网络描述: MobileNet V2提出了 the inverted residual with linear bottleneck,线性瓶颈反残差结构 ...

  7. 【万字干货】OpenMetric与时序数据库存储模型分析

    摘要:解读OpenMetric规范和指标的模型定义基础上,结合当下主流的时序数据库核心存储及处理技术,尝试让用户(架构师.开发者或使用者)结合自身业务场景选择合适的产品,消除技术选型的困惑. 本文分享 ...

  8. 【MobileNet V2】《MobileNetV2:Inverted Residuals and Linear Bottlenecks》

    CVPR-2018 caffe 版本的代码:https://github.com/shicai/MobileNet-Caffe/blob/master/mobilenet_v2_deploy.prot ...

  9. 基于FPGA的MobileNet V2卷积神经网络加速器

    MobileNet V2介绍 MobileNetV2是在V1基础之上的改进.V1主要思想就是深度可分离卷积.而V2则在V1的基础上,引入了Linear Bottleneck 和 Inverted Re ...

最新文章

  1. 计算机模拟组装测试题一,江苏专转本计算机模拟自测试题(一)
  2. QIIME 2用户文档. 12数据筛选Filtering data(2019.7)
  3. CentOS-6.4无线上网命令行配置
  4. 【LDA学习系列】神奇的Gama函数Python代码
  5. stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)
  6. 2.3.1 进程同步 进程互斥
  7. Python中国际化(i18n)完整指南
  8. 基于WebStorm, React和Ant.Design开发WebAppDemo
  9. Set实现类性能对比
  10. SSH 远程连接服务慢的解决方案
  11. 营销和生意人的4项基本修炼
  12. 机器学习监督学习之分类算法---朴素贝叶斯代码实践
  13. 2016年的第一天上班,顺便开通了博客
  14. wireless 时好时断的一些解决的建议
  15. java得到日期相减的天数_java得到日期相减的天数
  16. 寄存器以及偏移地址计算方法
  17. 我的TLS1.3之旅
  18. 学霸是怎样炼成的?学了那么多还一无是处?如何克服学习阻力?一件枯燥讨厌的事但必须要做?内心强大的主观改造 自我加速(学以致用)与环境加速(学习型组织)
  19. 零基础语法入门三十一讲[被动语态 (1)]被动语态的构成和含义
  20. 201871010133-赵永军《面向对象程序设计(java)》第二周学习总结

热门文章

  1. MonoDETR:用于单目3D检测的深度感知transformer(CVPR2022)
  2. 兽兽门尘埃落地 成都爆许愿门
  3. Category 类别 -Objective-C
  4. linux磁盘无法识别移动硬盘
  5. vue + elementui +sass+axios做卖座网的后台管理系统
  6. windows10神州网信政府版“麦克风”权限如何打开?
  7. Widget原理分析
  8. oracle 物化视图没效果,Oracle物化视图失效的几种情况及测试
  9. Java数组实现循环队列
  10. 《软技能-代码之外的生存指南》读书笔记