轻量级网络MobileNeXt–改进MobileNet v2的逆残差结构

论文地址:ECCV 2020

《MobileNeXt: Rethinking Bottleneck Structure for Efficient Mobile Network Design》

要点

论文针对MobileNetV2的核心模块 逆残差结构存在的问题进行了深入分析,提出了一种新颖的 SandGlass模块,并用于组建了该文的MobileNeXt架构,SandGlass是一种通用的模块,它可以轻易的嵌入到现有网络架构中并提升模型性能,这种轻量级模块有原生残差块和倒置残差块的影子,是一种正向残差设计。

回顾

ResNet 使用标准卷积提取特征,MobileNet 始终使用DW卷积提取特征。

ResNet 先降维、卷积、再升维,而 MobileNet V2 则是 先升维、卷积、再降维。

直观上看,ResNet 的微结构是沙漏形,而 MobileNet V2 则是纺锤形。

因此作者将 的结构称为 Inverted Residual Block。这么做也是因为使用DW卷积而作的适配,希望特征提取能够在高维进行。

如下图所示,左侧是ResNet网络中的残差结构(中间窄两头宽),右侧就是MobileNet v2中的逆残差结构(中间宽两头窄)。

在残差结构中是1×1卷积降维->3×3卷积提取特征->1×1卷积升维,在逆残差结构中正好相反,是1×1卷积升维->3x3DW卷积提取特征->1×1卷积降维。 MobileNet V2 的解释是高维信息通过ReLU激活函数后丢失的信息更少。

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

下图为ResNet, MobileNetV2和论文提出的MobileNeXt的对比:
ResNet残差块组成:1×1卷积(降维)、3×3卷积(空间信息特征提取)、1×1卷积(升维);
MobileNetV2倒置残差块组成:1×1卷积(升维)、3×3深度可分卷积(空间信息特征提取)、1×1卷积(降维);
MobileNeXt沙漏残差块组成:3×3深度可分卷积(空间信息特征提取)、1×1卷积(降维)、1×1卷积(升维)、3×3深度可分卷积(空间信息特征提取),该结构与正向残差类似,区别在于使用了深度卷积;

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

问题

ResNet残差块中间的3*3卷积的参数量和计算量都非常大,不适用于轻量级网络;

MobileNetV2的Inverted residual block,专为移动设备设计,为了节省计算量,输入改为低维度特征,先通过pointwise卷积扩大维度,然后通过depthwise卷积提取特征,最后通过pointwise卷积降低维度输出;skip path仅建立在低维度bottleneck间,最后一个pointwise卷积不使用非线性激活;

尽管Inverted residual block性能不错:

但输入需要将特征先降到较低的维度,但是降低维度可能不足以保留足够的有用信息;

近期有研究发现更宽的网络结构(输入输出通道数更多)有助于缓解梯度混淆(特指梯度消失与梯度爆炸,不同batch产生的梯度抵消),能够提升网络性能;

shortcut建立在bottleneck之间,由于bottleneck维度较少,也可能会阻碍梯度的回传。

为解决上述问题,论文提出了设计更优的sandglass block,结构如图3(c),基于此搭建了MobileNeXt,在性能和计算量上都优于MobileNetV2。

亮点

考虑到上述逆残差模块存在的问题,论文作者的设计原则:

保持更多的信息从bottom传递给top层,进而有助于梯度回传;

深度卷积是一种轻量型单元,可以执行两次深度卷积以编码更多的空间信息。

作者重新思考移动网络的bottleneck结构,发现inverted residual并不是最优的bottleneck结构。

研究发现, shortcut应该建立在高维度特征上depthwise卷积应该应用在高维度特征空间上学习更多样特征,linear residual是bottleneck结构的关键。

sandglass block

如下图所示:(a) Residual Bottleneck (b) SandGlass Bottleneck

SandGlass块本质上是一个经典的残差块,其中主分支中的第一个和最后一个卷积层是保留通道的空间深度卷积层。为了模拟瓶颈结构,它使用两个连续的逐点卷积来减少然后增加通道数,这些PW卷积堆叠在两个深度卷积层之间。由于现在更大的通道张量由深度内核操作,因此与MobileNetV2相比,参数数量大大减少。

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

sandglass block理论分析 :

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构
  • Activation Layer:已有研究表明,线性瓶颈层有助于避免特征出现零化现象,进而导致信息损失。基于此,作者在用于降维的1×1卷积后不添加激活函数。同时最后一个深度卷积后也不添加激活函数,激活函数加在第一个3*3深度卷积与最后一个1×1卷积之后。
  • Block Structure.:基于上述考虑,我们得到了该文所设计的新颖的残差瓶颈模块,结构如下表与上图b所示。注意:当输入与输出通道数不相同时不进行短连接操作。

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

表中ReLU6是指具有最大输出限制为6的relu函数,主要是为了在移动端设备float16/int8的低精度时也能有很好的数值分辨率,如果对普通relu函数的激活范围不加限制,输出的范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的loat16/int8就无法良好地精确描述如此大范围地数值,从而带来精度地损失;

线性激活函数linear是指线性映射(y=x),这有助于避免零化现象的出现,进而减少信息损失。

MobileNeXt网络结构

输入为2242243,然后是卷积后32维输出,后续是sandglass block的堆叠,最后是全局平均池化,将二维的特征图压缩为一维,最后再由全连接层、softmax函数输出每个类别的分数。

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

Identity tensor multiplier

尽管shortcut连接有助于梯度的回传,但论文通过实验发现, 没有必要保持完整的特征去跟residual path结合。为了让网络对移动设备更友好,论文提出超参数identity tensor multiplier

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构,用于控制shortcut传递的特征维度,假设轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构表示残差分支的变换函数;

原来的residual block计算可表示为:

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

加入超参数后的residual block计算可表示为:

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

超参数的作用

通过降低该超参数,每个模块中的add数量可以进一步降低,因为add操作会占用不少耗时,用户可以选择更少的以得到更好的推理速度且性能几乎无影响;

可以降低内存访问时间。影响模型推理的一个重要因素是:内存访问消耗(Memory acces cost, MAC)。降低该超参数有助于减少cache占用,进而加速推理。

即作者考虑到用在移动设备的延时问题,作者不对所有来自短径连接地数据进行add,只选择其中地一部分进行连接,论文实验表明取特征的 一半进行加和,可以保持速度和精度的最佳。

下图为不完全的短径连接:

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

实验

tensor multiplier 选择:

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

ImageNet分类任务效果如下:

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

与其他网络结构在ImageNet上进行对比:

轻量级网络MobileNeXt--改进MobileNet v2的逆残差结构

总结

作者对逆残差结构进行了改进,又变回了正向残差结构,从高维特征获取到更多的信息,并解决shortcut连接所带来的梯度问题,在11PW卷积之间不使用33卷积来提取特征,而是先进行降维再进行升维以更新融合特征。

MobileNet作为一个轻量级网络,但是论文作者并没有列出在实际移动设备上的应用。

参考

MobileNeXt | 新一代手机端模型

PyTorch实现

MobileNext:打破常规,依图逆向改造inverted residual block

依图科技MobileNeXt

仅为学习记录,侵删!

Original: https://blog.csdn.net/panghuzhenbang/article/details/124855606
Author: 胖虎记录学习
Title: 轻量级网络MobileNeXt–改进MobileNet v2的逆残差结构

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788260/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 18个在线的 Python 解释器

    安装 Python 很容易,但或许你正在用智能手机/平板电脑,在用不允许安装软件的电脑,或者因为其它原因无法安装 Python。那么,如何通过免安装的方式使用 Python 呢? …

    Python 2023年9月22日
    037
  • merge规则 python_python dataframe 在merge时 产生笛卡尔积

    在pandas中,concat, merge, join的使用方法可以参考以下资料: http://blog.csdn.net/stevenkwong/article/detail…

    Python 2023年8月9日
    052
  • PIL中的P模式、P模式转为L模式

    目录 1. 参考链接 2. code:显示调色板情况 3. 得到该图像的模式以及转换 * 1. 得到图像的mode 2. 转换模式(接上),用convert 4. 其他相关博文 参…

    Python 2023年8月25日
    058
  • Scrapy爬虫之MongoDB数据存储

    小编学习python爬虫已有一段时间了,对Scrapy框架开发有自己的一点小见解,如果有说不对的地方,希望大家多多指点。小编用的是Python2.7,如果觉得版本太旧,也可以用3….

    Python 2023年10月3日
    035
  • 各种坐标系下坐标转换关系

    本资源为Qt绘图基础,世界 为逻辑 。世界 原点在视图左上角,本例子通过世界 ,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑 下的绘图,可将 函数取消生效,…

    Python 2023年8月24日
    088
  • day10_python2和python3的继承

    day10_python2和python3的继承 原创 wx5e6caa8b9792d2022-08-01 17:04:21博主文章分类:Python自动化开发 ©著作权 文章标签…

    Python 2023年5月24日
    069
  • 点乘与叉乘

    几何含义 0.1 点乘 点乘,又称向量的内积,结果为一个数,计算公式如下: 上述公式的推导过程如下: 因此,通过点乘可以得出两个向量之间的夹角,向量垂直时,点乘结果为0. 0.2 …

    Python 2023年8月26日
    054
  • ORB-SLAM3代码详解—-基本框架解析及ORB特征提取

    一个典型的视觉SLAM系统主要包含数据处理、初始化、视觉里程计、地图维护、闭环检测等部分。 1.1 关键技术解析 1.1.1 初始化关键技术解析 初始化:主要就是以第一帧图像为参考…

    Python 2023年10月11日
    051
  • 又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速

    摘要:上海人工智能实验室的浦视开源算法体系(OpenMMLab)团队基于昇腾AI发布了MMDeploy 0.10.0版本,该版本已支持OpenMMLab算法仓库在昇腾异构计算架构C…

    Python 2023年10月29日
    036
  • Windows的压缩文件夹(zip/cab)

    https://weibo.com/1114096665/DtHXgvnva #windows10# 硬要把zip…

    Python 2023年6月3日
    063
  • Pandas操作题

    Pandas操作题 1.学生数据分析 1.数据导入并展示, 文件位置位于../data/下 请将文件student-info.csv中的内容读入pandas DataFrame &…

    Python 2023年8月18日
    064
  • 笔记本 M.2 PCIe 3.0 x4 外接显卡方案与实践

    前言 本博客的上一篇文章更新于2021年2月,距今已经有一年半了。这一年半我一切正常,没有经历任何糟糕的事情,一直没更新纯粹是因为太忙。一年半的高压下来,我的心态也变化了不少,这些…

    Python 2023年10月18日
    0133
  • 【微服务】java 操作elasticsearch详细总结

    上一篇我们通过kibana的可视化界面,对es的索引以及文档的常用操作做了毕竟详细的总结,本篇将介绍如何使用java完成对es的操作,这也是实际开发中将要涉及到的。 目前,开发中使…

    Python 2023年8月30日
    052
  • python np.loadtxt() 读取数据集时报错ValueError: could not convert string to float以及pandas.readcsv()对比

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!! 这里写自定义目录标题 …

    Python 2023年8月28日
    078
  • simpleui模板的使用

    回答1: Django 是一个基于 Django 的后台管理系统框架,它提供了一些简单易用的页面定制功能,可以让开发者快速定制自己的后台管理页面。 要定制 Django 的页面,可…

    Python 2023年8月5日
    040
  • Django model相关操作

    文章目录 MySQL配置: 创建模型类 * 使用AbstractUser重构user表 怎么获取重构user的model 重构的模型类怎么生成表 创建父类模型类 模型类如何使用联合…

    Python 2023年8月4日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球