• MobileNet系列(4):MobileNetv3网络详解


    引言

    当前很多轻量级网络会经常使用到MobileNetv3,本文将讲解google继MobileNetv2之后提出的v3版本。MobileNetv3论文Searching for MobileNetV3

    在这里插入图片描述
    根据MobileNetV3论文总结,网络存在以下3点需要大家注意的:

    • 更新了Block(bneck),在v3版本中原论文称之为bneck,在v2版倒残差结构上进行了简单的改动。
    • 使用了NAS(Neural Architecture Search)搜索参数
    • 重新设计了耗时结构:作者使用NAS搜索之后得到的网络,接下来对网络每一层的推理时间进行分析,针对某些耗时的层结构做了进一步的优化

    MobileNetV3性能提升

    MobileNetV3-Large is 3.2% more accurate on ImageNet classification while reducing latency by 20% compared to MobileNetV2. MobileNetV3-Small is 6.6% more accurate compared to a MobileNetV2 model with comparable latency. MobileNetV3-Large detection is over 25% faster at roughly the same accuracy as MobileNetV2 on COCO detection. MobileNetV3-Large LRASPP is 34% faster than MobileNetV2 R-ASPP at similar accuracy for Cityscapes segmentation

    在这里插入图片描述

    • 可以看出V3版本的Large 1.0(V3-Large 1.0)Top-175.2,对于V2 1.0 它的Top-172,相当于提升了3.2%
    • 在推理速度方面也有一定的提升,(V3-Large 1.0)P-1手机上推理时间为51ms,而V264ms,很明显V3V2,不仅准确率更高了,而且速度更快了
    • V3-Small版本的Top-167.4,而V2 0.35 (0.35表示卷积核的倍率因子)的Top-1只有60.8,准确率提升了6.6%

    很明显V3版本比V2版本要更优秀

    网络的改进

    更新了Block

    • 加入了SE模块(注意力机制)
    • 更新了激活函数

    MobieNetV2 Block

    在这里插入图片描述

    • 首先会通过一个1x1卷积层来进行升维处理,在卷积后会跟有BNReLU6激活函数
    • 紧接着是一个3x3大小DW卷积,卷积后面依旧会跟有BNReLU6激活函数
    • 最后一个卷积层是1x1卷积,起到降维作用,注意卷积后只跟了BN结构,并没有使用ReLU6激活函数。

    另外网络还存在一个捷径分支shotcut,将我们输入特征矩阵与输出特征矩阵在相同维度的数值上进行相加操作。并且只有DW卷积的步距为1,且input_channel==output_channel,才有shotcut连接

    MobieNetV3 Block

    在这里插入图片描述
    咋一看,与MobieNetV2 Block也没什么区别,最显眼的区别就是在MobieNetV3 Block中存在SE模块(注意力机制)

    SE模块

    对得到的特征矩阵,对每个channel进行池化处理,接下来通过两个全连接层得到输出的向量,其中第一个全连接层,它的全连接层节点数是等于输入特征矩阵channel的1/4,第二个全连接层的channel是与我们特征矩阵的channel保持一致的。经过平均池化+两个全连接层,输出的特征向量可以理解为是对SE之前的特征矩阵的每一个channel分析出了一个权重关系,它认为比较重要的channel会赋予一个更大的权重,对于不是那么重要的channel维度上对应一个比较小的权重

    在这里插入图片描述
    如上图所示:假设我们特征矩阵的channel为2,使用Avg pooling针对每一个channel去求一个均值,因为有两个channel,所以得到2个元素的向量,然后依次在经过两个全连接层,第一个channel为原来channel的1/4,并且对应relu激活函数。对于第二个全连接层它的channel和我们特征矩阵channel维度是一致的,注意这里使用的激活函数使h-sigmod,然后得到和特征矩阵channel大小一样的向量,每个元素就对应于每个channel的权重.比如第一个元素是0.5,将0.5与特征矩阵第一个channel的元素相乘,得到一个新的channel数据。

    另外网络更新了激活函数
    在这里插入图片描述
    对应图中的NL表示的就是非线性激活函数,在不同层中使用的激活函数不一样,这里没有给出一个明确的激活函数,而是标注了一个NL,注意最后一层1x1的卷积是没有使用非线性激活函数的,用的是线性激活函数。

    MobieNetV3 Block和MobieNetV2 Block结构基本是一样的,主要是增加了SE结构,并对激活函数进行了更新

    重新设计耗时层结构

    原论文中主要讲了两个部分:

    • 减少第一个卷积层的卷积个数(32 -> 16)
      在v1,v2版本第一层卷积核个数都是32的,在v3版本中我们只使用了16个
      在这里插入图片描述
      在原论文中,作者说将卷积核Filter个数从32变为16之后,它的准确率是和32是一样的,既然准确率没有影响,使用更少的卷积核计算量就变得更小了。这里节省了大概2ms的运算时间
    • 精简 Last Stage
      在使用NAS搜索出来的网络结构的最后一部分,叫做Original last Stage,它的网络结构如下:
      在这里插入图片描述
      该网络是主要是通过堆叠卷积而来的,作者在使用过程中发现这个Original Last Stage是一个比较耗时的部分,作者就针对该结构进行了精简,提出了一个Efficient Last Stage

    在这里插入图片描述
    Efficient Last Stage相比之前的Original Last Stage,少了很多卷积层,作者发现更新网络后准确率是几乎没有变化的,但是节省了7ms的执行时间。这7ms占据了推理11%的时间,因此使用Efficient Last Stage之后,对我们速度提升还是比较明显的。

    重新设计激活函数

    之前在v2版本我们基本都是使用ReLU6激活函数,现在比较常用的激活函数叫swish激活函数。
    s w i t h x = x . σ ( x ) swith x=x.\sigma(x) swithx=x.σ(x)
    其中 σ \sigma σ的计算公式如下:
    σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
    使用switch激活函数之后,确实能够提高网络的准确率,但是也存在2个问题:

    • 计算、求导复杂
    • 对量化过程不友好(对移动端设备,基本上为了加速都会对它进行量化操作)

    由于存在这个问题,作者就提出了h-switch激活函数,在讲h-switch激活函数之前我们来讲一下h-sigmoid激活函数

    h-sigmoid激活函数是在relu6激活函数上进行修改的:
    R E L U 6 ( x ) = m i n ( m a x ( x , 0 ) , 6 ) RELU6(x)=min(max(x,0),6) RELU6(x)=min(max(x,0),6)
    h − s i g m o i d = R e L U 6 ( x + 3 ) 6 h-sigmoid=\frac{ReLU6(x+3)}{6} hsigmoid=6ReLU6(x+3)

    在这里插入图片描述
    从图中可以看出h-sigmoidsigmoid激活函数比较接近,所以在很多场景中会使用h-sigmoid激活函数去替代我们的sigmoid激活函数。因此h-switch σ \sigma σ替换为h-sigmoid之后,函数的形式如下:
    h − s w i t c h [ x ] = x R e L U 6 ( x + 3 ) 6 h-switch[x]=x\frac{ReLU6(x+3)}{6} hswitch[x]=x6ReLU6(x+3)

    如上图右侧部分,是switchh-switch激活函数的比较,很明显这两个曲线是非常相似的,所以说使用h-switch来替代switch激活函数还是挺棒的。

    在原论文中,作者说将h-switch替换switch,将h-sigmoid替换sigmoid,对于网络的推理过程而言,在推理速度上是有一定帮助的,并且对量化过程也是非常友好的。

    MobieNetV3-Large 版本的网络结构

    在这里插入图片描述
    简单看下表中各参数的含义:

    • input输入层特征矩阵的shape
    • operator表示的是操作,对于第一个卷积层conv2d;这里的
    • #out代表的输出特征矩阵的channel,我们说过在v3版本中第一个卷积核使用的是16个卷积核
    • 这里的NL代表的是激活函数,其中HS代表的是hard switch激活函数,RE代表的是ReLU激活函数;
    • 这里的s代表的DW卷积的步距;
    • 这里的beneck对应的是下图中的结构;
    • exp size代表的是第一个升维的卷积,我们要将维度升到多少,exp size多少,我们就用第一层1x1卷积升到多少维。
    • SE:表示是否使用注意力机制,只要表格中标所对应的bneck结构才会使用我们的注意力机制,对没有打就不会使用注意力机制
    • NBN 最后两个卷积的operator提示NBN,表示这两个卷积不使用BN结构,最后两个卷积相当于全连接的作用
    • 注意:第一个bneck结构,这里有一点比较特殊,它的exp size和输入的特征矩阵channel是一样的,本来bneck中第一个卷积起到升维的作用,但这里并没有升维。所以在实现过程中,第一个bneck结构是没有1x1卷积层的,它是直接对我们特征矩阵进行DW卷积处理

    在这里插入图片描述

    bneck
    • 首先通过1x1卷积进行升维到exp size,通过DW卷积它的维度是不会发生变化的,同样通过SE之后channel也会不会发生变化的。最后通过1x1卷积进行降维处理。降维后的channel对应于#out所给的数值。
    • 对于shortcut捷径分支,必须是DW卷积的步距为1,且bneckinput_channel=output_channel才有shortcut连接

    通过这个表我们就可以搭建MobilenetV3网络结构了

    对于MobileNetV3-Small网络结构,如下,这里就不讲了,跟我所讲的基本上都一致的。

    在这里插入图片描述

    MobileNetV3-Small
  • 相关阅读:
    ssh动态代理配置(Tunnel)
    HTTPS 的加密流程
    Spring MVC 中的数据验证技术
    腾讯大佬资深架构师深度解析微服务架构设计之SpringCloud+Dubbo
    Java Map,List,Array,Collections工具类常用方法
    es查询响应结果中获取某些字段的值
    形态学 - 骨架
    C++(17):make_from_tuple
    自动化测试用例的编写,只需要牢记7点,轻轻松松
    Git从入门到项目实战,一篇文章吃透Git
  • 原文地址:https://blog.csdn.net/weixin_38346042/article/details/125470446