MobileNet_v2
研究动机: 神经网络彻底改变了机器智能的许多领域,实现了超人的准确性。然而,提高准确性的驱动力往往需要付出代价:现代先进网络需要高度计算资源,超出许多移动和嵌入式应用的能力。
主要贡献: 发明了一个新的层模块, 具有线性瓶颈的倒置残差(inverted residual)。
相关工作: 里面介绍了近来整个领域的发展概况, 看论文就看介绍的吧.
基本概念
深度可分离卷积
Depthwise Separable Convolutions = depthwise + pointwise
如果卷积核大小为 3x3, 深度可分离卷积的计算量为常规卷积的 (1/9, 1/8)
流形(manifold)
花书 <<深度学习>> 介绍:
\(\color{red}{流形(manifold)}\) 指连接在一起的区域。数学上,它是指一组点,且每个点都 有其邻域。给定一个任意的点,其流形局部看起来像是欧几里得空间。日常生活中, 我们将地球视为二维平面,但实际上它是三维空间中的球状流形。
每个点周围邻域的定义暗示着存在变换能够从一个位置移动到其邻域位置。例 如在地球表面这个流形中,我们可以朝东南西北走。
尽管术语 “流形’’ 有正式的数学定义, 但是机器学习倾向于更松散地定义一组 点,只需要考虑少数嵌入在高维空间中的自由度或维数就能很好地近似。每一维都对应着局部的变化方向。如图 5.11 所示, 训练数据位于二维空间中的一维流形中。 在机器学习中,我们允许流形的维数从一个点到另一个点有所变化。这经常发生于流形和自身相交的情况中。例如,数字 "8" 形状的流形在大多数位置只有一维,但 在中心的相交处有两维。
\(\color{red}{流形学习(manifold\space learning)}\) 算法假设: 该假设认为 \(R^n\) 中大部分区域都是无效的输入,有意义的输入只分布在包 含少量数据点的子集构成的一组流形中,而学习函数的输出中,有意义的变化都沿着流形的方向或仅发生在我们切换到另一流形时。
数据位于低维流形的假设并不总是对的或者有用的。我们认为在人工智能的一 些场景中,如涉及到处理图像、声音或者文本时,流形假设至少是近似对的。
Linear Bottlenecks
Linear Bottlenecks 理论支持:
考虑由 n 层 \(L_i\) 组成的深层神经网络,其中每一层都具有尺寸为 \(h_i×w_i×d_i\)的激活张量。在本节中,我们将讨论这些激活张量的基本属性,我们将其视为具有 \(d_i\) 维度的 \(h_i×w_i\)“像素”的容器。非正式地说,对于输入的一组真实图像,我们说层激活(对于任何层 \(L_i\))形成一个“流形”。由于这种流形通常不能用分析方法描述,因此我们将凭经验研究它们的性质。例如,长期以来一直认为神经网络中感兴趣的流形可以嵌入到低维子空间中。换句话说,当我们查看深卷积层的所有单个通道像素时,这些值中编码的信息实际上位于某个流形中,而这又可嵌入到低维子空间中。
乍一看,这样的事实可以通过简单地减少层的维度来捕获和利用,从而降低操作空间的维度。这已经被 MobileNetV1 成功利用,通过宽度乘法器参数在计算和精度之间进行有效的折中. 遵循这种直觉,宽度乘法器方法允许减小激活空间的维度,直到感兴趣的流形横跨整个空间为止。然而,当我们回想到深度卷积神经网络实际上具有非线性的坐标变换(例如ReLU)时,这种直觉就会崩溃。例如,ReLU应用于1D空间中的线会产生'射线',在 \(R^n\) 空间中,其通常导致具有 n 截的分段线性曲线。
insight:
- 如果流形在ReLU变换后保持非零卷 (no-zero volume),则它对应于线性变换.
- ReLU能够保留关于输入流形的完整信息,但只有当输入流形位于输入空间的低维子空间时。
这两个见解为我们提供了一个优化现有神经架构的经验提示:假设感兴趣的流形是低维的,我们可以通过将线性瓶颈层插入卷积模块来捕获这一点。 实验证据表明,使用线性层非常重要,因为它可以防止非线性破坏太多的信息。
Inverted residuals

We will refer to the ratio between the size of the input bottleneck and the inner size as the expansion ratio.
\(\color{red}{由于 Inverted \space residuals 两边 thin, 所以该设计想比较传统残差设计更加节省内存}\)
论文观点
架构的一个有趣特性是它在构建块(瓶颈层)的输入/输出域与层转换(这是一种将输入转换为输出的非线性函数)之间提供了自然分离. 前者(层输入/输出)可以看作是网络在每一层的容量,而后者(层转换)则是表达力。这与常规和可分离的传统卷积块相反,其中表现力和容量都缠结在一起,并且是输出层深度的函数。
\(\color{red}{在论文的最后提出}\):
On the theoretical side: the proposed convolutional block has a unique property that allows to separate the network expressivity (encoded by expansion layers) from its capacity (encoded by bottleneck inputs). Exploring this is an important direction for future research.
这种解释使我们能够独立于其容量研究网络的表现力,并且我们认为需要进一步探索这种分离,以便更好地理解网络性质.
我的理解:
- 由于文中在前面提到, 当流型存在于高维输入空间的低纬空间时, 通过 Relu 几乎可以保留全部信息
- 在 bottleneck inputs 之后的 expansion layers 会有 1x1 卷积升维操作, 所以认为经过 Relu 没有损失信息, 即模型的容量不变, expansion layers的操作可以看做是层的表达力, 然后通过 Linear Bottlenecks, 也没有损失信息, 故全程保持模型的容量不变, 可以通过调节 expansion ratio, t 来调节模型的表达力
网络结构
实现细节:
base learning rate = 0.045
weight decay = 0.00004
t = 5 - 10
dropout + bn + relu6
RMSPropOptimizer momentum = 0.9 decay = 0.9
网络结构


表中错误已修正
内存节约型 inference
计算图 G, 在推导时(inference ), 内存总量和边界如下:
M(G) &= \max_{op \in G}\left[\sum_{A\in op_{input}}A + \sum_{B\in op_{output}}B + |op| \right] \\
\end{align*}
\]
内存占用量是所有操作对应输入和输出张量的总大小与操作本身所占内存之和决定。 如果我们将瓶颈残差块视为单一操作(并将内部卷积视为一次性张量[即用完就丟]),则总内存量将由瓶颈张量的大小决定,而不是瓶颈内部张量的大小决定
MobileNet_v2的更多相关文章
- 实践案例丨基于ModelArts AI市场算法MobileNet_v2实现花卉分类
概述 MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear ...
- MobileNet系列之MobileNet_v2
MobileNet系列之MobileNet_v1 Inception系列之Inception_v1 Inception系列之Batch Normalization Inception系列之Ince ...
- 『高性能模型』轻量级网络MobileNet_v2
论文地址:MobileNetV2: Inverted Residuals and Linear Bottlenecks 前文链接:『高性能模型』深度可分离卷积和MobileNet_v1 一.Mobil ...
- TensorFlow从1到2(九)迁移学习
迁移学习基本概念 迁移学习是这两年比较火的一个话题,主要原因是在当前的机器学习中,样本数据的获取是成本最高的一块.而迁移学习可以有效的把原有的学习经验(对于模型就是模型本身及其训练好的权重值)带入到新 ...
- TensorFlow从1到2(五)图片内容识别和自然语言语义识别
Keras内置的预定义模型 上一节我们讲过了完整的保存模型及其训练完成的参数. Keras中使用这种方式,预置了多个著名的成熟神经网络模型.当然,这实际是Keras的功劳,并不适合算在TensorFl ...
- tensorflow用pretrained-model做retrain
最近工作里需要用到tensorflow的pretrained-model去做retrain. 记录一下. 为什么可以用pretrained-model去做retrain 这个就要引出CNN的本质了.C ...
- MACE(3)-----工程化
作者:十岁的小男孩 QQ:929994365 能下者,上. 前言 本文是MACE的第三步即MACE环境编译出来的库在Android工程中的使用.在第一篇博文中通过mace官方提供的安卓工程进行调试,本 ...
- MACE(2)-----模型编译
作者:十岁的小男孩 QQ:929994365 无用 本文仅用于学习研究,非商业用途,欢迎大家指出错误一起学习,文章内容翻译自 MACE 官方手册,记录本人阅读与开发过程,力求不失原意,但推荐阅读原文. ...
- MACE(1)-----环境搭建
作者:十岁的小男孩 QQ:929994365 无为 本文仅用于学习研究,非商业用途,欢迎大家指出错误一起学习,文章内容翻译自 MACE 官方手册,记录本人阅读与开发过程,力求不失原意,但推荐阅读原文. ...
随机推荐
- 关于jstl的使用
1.jsp中el表达式无法被解析 使用jstl标签的时候,发现el表达式无法被解析,后来查阅资料发现jsp中需要添加<%@page isELIgnored="false" % ...
- kubernetes Auto Install Guide
1.概念&架构 Kubernetes is an open-source system for automating deployment, scaling, and management o ...
- 初读 c# IL中间语言
对一段c#编写的代码,有一些疑问,想通过IL中间语言看看,编译后是怎么处理的.代码如下: static StringBuilder sb = new StringBuilder(); ; ; /// ...
- jsp常见jstl语法(二)
<c:choose>标签与Javascript switch语句的功能一样,用于在众多选项中做出选择. 语法格式 <c:choose> <c:when test=&quo ...
- 纯代码实现WordPress评论回复自动添加@评论者的功能
先看看效果: 这个有什么用呢?添加了@功能之后那些用户评论之间的层次关系就很清晰了,我们可以清楚地知道这些评论是谁发给谁的. 其实主要是为了提升逼格. 实现方法: 将下面代码加入function.ph ...
- SublimeText3插件安装及使用
之前写过一篇文章讲了安装PackageControl,这里就不做赘述了,需要的朋友移步到这篇文章:Sublime Text安装package control 安装插件方法:通过preferencs-- ...
- Spring OAuth2 GitHub 自定义登录信息
# 原因 最近在做一款管理金钱的网站进行自娱自乐,发现没有安全控制岂不是大家都知道我的工资了(一脸黑线)? 最近公司也在搞 Spring OAuth2,当时我没有时间(其实那时候不想搞)就没做,现在回 ...
- python爬微信公众号前10篇历史文章(2)-拼接URL&发送http请求
如何拼接想要的url http://weixin.sogou.com/weixin?type=1&page=1&ie=utf8&query=%E5%A4%A7%E7%BA%BD ...
- ios滑动流畅(丝般顺滑)滚动
在ios html->body->list(少一个样式都不行!) html->body->list <!DOCTYPE html> <html lang=&q ...
- Django基本命令
下载Django pip3 install django #默认下载最新版 pip3 install django==1.11.1 #手动选择版本 创建Django项目 格式:django-admin ...