MobileNetV2: Inverted Residuals and Linear Bottlenecks

MobileNetV2---倒残差结构的线性瓶颈层

MobileNet v2网络是由google团队在2018年提出的,相比MobileNetV1网络,准确率更高,模型更小。

首先再次对Bottleneck模块进行简单的介绍与说明。

这是一个Standard bottleneck,这种bottleneck结构在深度神经网络中广泛使用,特别是在卷积神经网络中,它可以有效减少参数数量,降低运算复杂度,同时尽可能保持网络性能

python 复制代码
class Bottleneck(nn.Module):
    # 
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansion
        super(Bottleneck, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

c_,计算中间层的通道数,这样做可以在不大幅增加计算量的前提下增加网络的宽度

cv1,定义第1个卷积模块,卷积核为11,步长为1
cv2,定义第2个卷积模块,将通道数返回至c2,使用3
3卷积核,步长为1,并根据g参数进行分组卷积操作。这样的设计有助于增强网络的表达能力,同时通过分组卷积减少计算量

第一个卷积层将输入通道数c1缩减到一个中间的通道数c_(通常是输出通道数c2的某个比例)。
第二个卷积层将中间通道数c_恢复到输出通道数c2,同时可以根据配置应用组卷积(group convolution)

这样我们就会形成一个类似瓶子的两头大中间细的结构,将这种结构形象的称为Bottleneck

倒残差结构

  1. 说明残差结构与倒残差结构的区别:

逆残差结构(lnyerted residuals):在ResNet中,为了构建更深的网络,提出了ResNet的另一种形式,bottleneck,结构如下所示,一个bottleneck由一个1x1卷积(降维),3x3卷积和1x1卷积(升维)构成。在MobileNet中,DepthwiseConv卷积的层数是输入通道数,本身就比较少,如果跟残差网络中的bottleneck一样,先压缩,后卷积提取,可得到的特征就太少了。采取了一种逆向的方法,先升维,卷积,再降维。

本来的通道数就比较少,如果在进行降维的话就会保存更少的信息了

通过这个图我们可以很明显的看出残差模块的主要的操作是通过:

  • 1x1 卷积降维
  • 3x3卷积
  • 1x1 卷积升维

所形成的两头大中间小的结构

而第二幅图可以看出倒残差结构正好就是一个相反的过程,它的操作主要是通过:

  • 1x1 卷积升维
  • 3x3卷积DW
  • 1x1卷积降维

所形成的两头小中间大的结构

这个图的区别还要一个地方就在于倒残差的结构使用的激活函数是Relu6的激活函数,而普通的残差结构使用的是Relu激活函数。

激活函数

Relu激活函数:

ReLU ⁡ ( x ) = max ⁡ ( x , 0 ) \operatorname{ReLU}(x)=\max (x, 0) ReLU(x)=max(x,0)

Relu6激活函数的表达式子

y = ReLU ⁡ 6 ( x ) = min ⁡ ( max ⁡ ( x , 0 ) , 6 ) y=\operatorname{ReLU} 6(x)=\min (\max (x, 0), 6) y=ReLU6(x)=min(max(x,0),6)

超过6的值置为6即可

Linear Bottlenecks

线性瓶颈层(Linear Bottleneck):在高维空间上,诸如ReLU这种激活函数能有效增加特征的非线性表达,但是仅限于在高维空间中,如果维度降低,到了低维空间,再加入ReLU则会破坏特征。

在MobileNetsv2中提出了Linear Bottlenecks结构,也就是在执行了降维的卷积层后面,不再加入类似ReLU等的激活函数进行非线性转化,这样做的目的也是尽可能的不造成信息丢失。

针对这个问题作者在论文中也给出了做过的一个实验如下所示:

随着维度的上升,直到15维左右,才会保留一定的信息和原来的信息保持基本的一致性。

ReLU激活函数对低维特征信息造成大量损失

V2的改进工作

线性瓶颈层

也就是在深度可分离卷积的最后一层pw卷积那里,将激活函数去掉而是使用线性层来进行是实现。

具体的改进细节:

  • 均采用PW(Point-wise)+DW(Depth-wise)的卷积方式提取特征
  • V2版本在DW卷积之前新加入一个PW卷积,能动态改变特征通道(DW卷积没有改变通达数的能力,如果给的通道数过少会产生问题

给的信息太少的话也没法把特征提取出来

  • V2去掉了第二个PW的激活函数,最大程度保留有效特征

倒残差结构

改进的地方在于参考了RestNet这一网络的结构并进行了一定的改进。

  • 借鉴ResNet,都采用了1x1->3x3->1x1的模式
  • 借鉴ResNet,同样使用Shortcut短路连接将输出与输入相加
  • ResNet利用标准卷积提取特征,V2利用深度卷积(DW)提取特征
  • ResNet先降维:卷积、再升维,而V2则是先升维、卷积,再降维

从沙漏型到纺锤型的结构

论文中给出了这种倒残差结构的简单模型结构图示。


当stride=1且输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接

其中t就是所谓的拓展因子。

  1. V2共有54层
  2. ReLU6就是普通的ReLU但是限制最大输出值为6,这是为了在移动端设备也能有很好的数值分辨率

V2的网络结构

论文中针对v2模型给出了其网络结构图示:

  • t是扩展因子
  • c是输出特征矩阵深度channel
  • n是bottleneck的重复次数
  • s是步距(针对第一层,其他为1)
相关推荐
老艾的AI世界5 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
sp_fyf_20248 小时前
【大语言模型】ACL2024论文-19 SportsMetrics: 融合文本和数值数据以理解大型语言模型中的信息融合
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理
CoderIsArt8 小时前
基于 BP 神经网络整定的 PID 控制
人工智能·深度学习·神经网络
z千鑫9 小时前
【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南
人工智能·pytorch·深度学习·aigc·tensorflow·keras·codemoss
EterNity_TiMe_9 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
思通数科多模态大模型10 小时前
10大核心应用场景,解锁AI检测系统的智能安全之道
人工智能·深度学习·安全·目标检测·计算机视觉·自然语言处理·数据挖掘
数据岛10 小时前
数据集论文:面向深度学习的土地利用场景分类与变化检测
人工智能·深度学习
学不会lostfound10 小时前
三、计算机视觉_05MTCNN人脸检测
pytorch·深度学习·计算机视觉·mtcnn·p-net·r-net·o-net
红色的山茶花10 小时前
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
笔记·深度学习·yolo
白光白光10 小时前
凸函数与深度学习调参
人工智能·深度学习