zoukankan      html  css  js  c++  java
  • MobileNet系列之MobileNet_v3

    MobileNet系列之MobileNet_v1

    MobileNet系列之MobileNet_v2

    导言:

        继MobileNet_v1和v2提出后,在2019年,MobileNet_v3在众人的期盼下出来了,MobileNet_v3论文提出了两个模型,MobileNet_v3-Large和MobileNet_v3-small,其主要区别在于层数不同(其余设计都一样),此外还包括一个用于语义分割的MobileNet_v3-Large LRASPP模型。

    MobileNet_v3成就

        MobileNet_v3-Large在ImageNet分类中实现了比MobileNet_v2低百分之20的时延,同时高了3.2%精度。MobileNet_v3-small比MobileNet_v2在时延接近的情况下,高了6.6%的精度。

        MobileNet_v3-Large在COCO数据集检测上,在比v2快了25%,而精度却几乎一样。

        MobileNet_v3-Large LRASPP比MobileNet_v2 RASPP在Cityscapes分割数据集上快了34%。应该可以说是不负众望了。

    MobileNet_v3主要内容

        MobileNet_v3着眼于赋予设备高效地实现高精度、低时延的能力,而不是发送数据到服务器,经过服务器推理后再发送回设备。为此,论文提出了以下内容:

    1) 补充搜索技术

    2) 适用于移动设备环境的非线性的新有效版本

    3) 新的高效网络设计

    4) 新的高效分割解码器(指的是语义分割)

    01  NAS 和NetAdapt

        当前,在人工智能界内有一句名言,所谓人工智能,是越人工越智能。现有的一些网络所具备的高效的性能离不开人对这个网络模型的精心设计与调参。最近几年,如何让计算机根据需求和现有硬件条件自动生成网络已经进入重要研究方向。

        NAS-神经网络架构搜索。NAS通过设定一个空间,选择一个搜索策略在这个空间内搜索,采用一个评估策略对搜索效果进行评估,最终选择评估效果最好的结构。

        在早期,NAS主要进行单元级搜索,使用一些预定义的操作集合,(如卷积、池化等)此外还包括,每一层的卷积核的大小,步长大小,卷积核数量等,这些集合构成了搜索空间,使用一个搜索策略来选择操作集合,在训练集训练这些操作集合组成的网络,并在验证集上评估当达到某个阈值将会停止。

        最近,开始进行Block级的搜索,例如Inception结构,就是一个Block,在搜索空间中使用了不同大小,不同数量的block。搜索策略直接搜索这些block组成网络,进行测试。

        MobileNet_v3使用了用于block搜索的平台感知NAS(PlatformAware NAS for Blockwise Search)构成全局网络结构,使用NetAdapt对网络结构进行layer-level的finetune。使用的搜索目标是 ACC(m) × [LAT(m) / TAR]^w, 这里ACC(m)是模型精度,LAT(m)是延时,TAR是目标延时,w是超参数。

    之所以不怎么介绍NAS,是因为NAS需要数以百计甚至上千的GPU来训练数月,例如 NASnet需要在 800 个 GPU 上训练 28 天,对于普通人来说实在有些遥不可及,当然最近也出了一些只需要少量GPU就能训练的算法,但至少现在还没到那种能满足普遍需求的时候。如有需要,公众号中有NAS的一篇较为全面的综述,可扫描文末二维码关注公众号。

    网络改进

        在搜索得到的网络的基础上,提出了一些改进的方案。在网络的开始和结束部分,重新设计了计算量大的层,此外还提出了一种新的非线性,即h-swish,h-swish是最近swish的改进版本,计算速度更快,也更易于量化。

    02  Redesigning Expensive Layers

        在MobileNet_v2的Inverted bottleneck结构中使用1x1卷积作为最后一层,用于扩大到一个更高维的特征空间,这一层对于提供丰富的特征用于预测极为重要,但也增加了延时。

      为了降低延时,并保持高维空间特征,MobileNet_v3中把这一层移到了平均池化层的后面,在最后的特征集现在只需要计算1x1的分辨率,而不是原来的7x7。这种设计选择的结果是,在计算和延迟方面,特性的计算变得几乎是免费的。

        一旦降低了该特性生成层的成本,就不再需要以前的瓶颈投影层来减少计算量。该观察允许删除前一个瓶颈层中的投影和过滤层,从而进一步降低计算复杂度。原始阶段和优化后的阶段如上图所示。

        另一个耗时的层是第一层卷积,当前的移动模型倾向于在一个完整的3x3卷积中使用32个滤波器来构建初始滤波器库进行边缘检测。通常这些过滤器是彼此的镜像。mobileNet_v3对这一层使h-swish非线性激活函数,其好处是使用了h-swish后滤波器的数量可以减少到16,而同时能够保持与使用ReLU或swish的32个滤波器相同的精度。这节省了额外的3毫秒和1000万 MAdds。

    03   Nonlinearities

        在一篇语义分割的论文中提出了使用swish的非线性函数来代替ReLU函数,它可以显著提高神经网络的精度,其定义为:swish x = x · σ(x),这里σ(x)是sigmoid函数。然而swish虽然提高了精度,但sigmoid函数计算是极为昂贵的,在嵌入式移动端不适合它的存在,因此,MobileNet_V3提出了计算更为简便的h-swish函数,其定义如下:

        如下图所示,这里的h是hard的意思,简单来说就是没那么平滑。经过实践检验,sigmoid和swish函数与其hard版本的函数在精度上并没有什么明显的差异。但是hard版本的计算却简便得多。

        一般来说,在不同的设备上,对于sigmoid函数都是采用近似的方式实现,(例如,在高数中采用划分矩形求面积来近似实现积分,这里的近似是使用某些实现方式近似实现sigmoid函数),因此不同的实现方式会导致潜在的精度损失。而几乎所有的软件和硬件设备都可以直接实现ReLU6,因此这里的h-swish将不会出现sigmoid的情况,此外,h-swish可以通过分段函数实现(这是对h-swish的优化,下图是与没有优化的实验效果对比),这样会降低内存访问次数,从而大大降低了等待时间成本。

        论文中提到,在较深的层次中使用更能发挥swish的大多数好处,因此在MobileNet_v3结构中 中高层才使用h-swish。此外,h-swish即便使用了这些优化,但仍然引入了一些延迟成本,如下图所示,使用分段函数作为h-swish的优化比没有优化效果明显要好,节约了6ms(大概百分之10), 而相比于ReLU, 优化后的h-swish仅引入了1ms的成本,但精度更高。

    04   Large squeeze-and-excite

        先简要介绍一下这个模块,论文中并没有介绍。

        这是一个注意力机制中的一个模块SE,即插即用,用于现有的一些网络。其分为两个部分,一个是Squeeze部分,通过AdaptiveAvgPool2d将前一层的空间分辨率压缩为1x1,第二个部分是Excitation部分,对压缩后的部分进行线性变化(Linear),再ReLU,再Linear(通道数要与下一层通道数一致),再Sigmoid。将得到的一个1x1x下一层通道数 的层与原先网络直接卷积得到的下一层逐像素相乘,这样的好处是有些特征会被突出,有些特征会被抑制,从而实现模型的自注意力机制。

        回到本文,MobileNet_v3中加入了这个模块,但进行了一些调整。一个是将sigmoid换成了h-swish。第二个是将第二Linear的通道数变为下一层的1/4。但这样就没办法逐像素相乘了,因为通道数不匹配,然后我去找了MobileNet_v3的代码,发现它在通道数变为1/4后又使用expand_as将其扩展成了下一层的通道数。

    MobileNet_v3结构:

    实验结论

        在本文开头已经介绍了MobileNet_v3的成就,记住那些即可,这里只给出图,就不多介绍了,无非就是不同的超参数下其精度和延时有何变化,在某某数据集中与某某模型对比。稍微看看足以

    本文来源于微信公众号“ CV技术指南 ” 。更多内容与最新技术动态尽在公众号发布。

    欢迎扫描下方二维码关注公众号“CV技术指南”,主要进行计算机视觉方向的论文解读,最新技术跟踪,以及CV技术的总结。

    原创文章第一时间在公众号中更新,博客只在有空时间才更新少量公众号文章

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/wxkang/p/14128415.html
Copyright © 2011-2022 走看看