MobileNet_v2详解

一、背景介绍

  MobileNet_v1看起来已经不错了,但有人在实际使用的时候, 发现depthwise layer的卷积核在训练之后不少参数为0,这很可能是因为ReLU导致神经元死亡。另外,MobileNet_v1没有引入shortcut,无法复用特征。

在这里插入图片描述

二、思路提出

2.1 Linear Bottlenecks

  假设将许多张图片作为网络的输入,经过第i层输出并激活之后得到一个 h i × w i × d i h_i \times w_i \times d_i hi×wi×di的张量,如果把这个张量看作是 h i × w i h_i \times w_i hi×wi个具有 d i d_i di维的点构成,那我们可以进一步把这个张量视为manifold of interest(可以理解为有用的特征)。这里manifold流形,如果以前没接触的话可以先移步流形学习的基本思想-知乎

  根据流形的思想,虽然对于神经网络的每一层,我们得到的是许多个 d i d_i di维的像素,但是这些高维数据里蕴含的信息实际上也存在于低维流形之中。作者说本来这个想法可以通过MobileNet_v1提出的width multiplier来验证,通过直接降维以达到让manifold of interest覆盖一整个低维子空间,我猜意思可能类似于下图,让3维空间中的一部分数据通过流形学习降维并覆盖满二维空间:

在这里插入图片描述

  但是作者发现CNN里有个非线性变换ReLU,所以这想法不行。因为涉及到流形,不行的原因我解释不了(论文里每个单词我都认得,但是我看不懂),所以后面我就直接放结论了。

  作者认为ReLU会造成信息的丢失,但是输入数据的channel越多,信息保存得越好。假设在2维空间有一组由m个点组成的螺旋线 X m X_m Xm数据作为输入,利用随机矩阵 T T T映射到n维空间上并进行ReLU运算,然后再利用 T − 1 T^{-1} T1投影回到2维空间得到$X_m^{’} $,即:
y = R e L U ( T X m ) X m ′ = T − 1 y y = ReLU(TX_m) \\ X_m^{'} = T^{-1}y y=ReLU(TXm)Xm=T1y

再将 X m X_m Xm X m ′ X_m^{'} Xm进行比较,就可以看出ReLU的作用。如下图所示,可以看到在n = 2,3的时候, X m ′ X_m^{'} Xm和原来相比已经丢失很多信息了,但是n = 15, 30的时候情况会好很多:

在这里插入图片描述

  我的理解是:因为ReLU会把负值归零,所以对于 d i d_i di维的像素,如果 d i d_i di越大,这么多特征经过ReLU后可能保留下的信息也就会越多,如果只有2/3维,那么一不小心就容易丢失信息。这类似于分散投资的想法,不要把所有鸡蛋放在一个篮子里。作者的原话也是大概这个意思:

when ReLU collapses the channel, it inevitably loses information in that channel. However if we have lots of channels, and there is a structure in the activation manifold that information might still be preserved in the other channels.

总之,作者最后得到了两个结论

  • 如果经过ReLU后输入还是非零的,那ReLU实际上只是一个线性变换
  • 仅当输入可以被嵌入到低维流形里时,ReLU可以保留输入的完整信息。我的理解是,因为ReLU会造成信息丢失,但是如果输入没有信息冗余的话,ReLU是保留不了完整信息的。

  基于这两个结论,作者提出了本文关键linear bottlenecklinear bottleneck本质上就是将 1 × 1 1 \times 1 1×1的卷积层之后的ReLU替换成了Linear Layer,而称作bottleneck是因为通道数明显改变了。下图带有纹理的方块就是指Linear Layer,原本MobileNet_v1里的pointwise layer之后使用ReLU的,但是这里换成了线性函数。
在这里插入图片描述

2.2 Inverted residuals

  在Linear Bottleneck的基础上,作者还想引入ResNet的残差连接,以实现特征复用和缓解梯度消失/爆炸,所以提出了inverted residual
在这里插入图片描述

  图(a)是ResNet里的Residual block,图(b)就是MobileNet_v2提出的inverted residual block。两者区别在哪呢?图上蓝色方块的厚度表示通道数量,可以看出Residual block是先降维再进行升维,而inverted residual block是先升维再进行降维,即如下图所示:
在这里插入图片描述

  具体来说,ResNet是先将通道数降为原来的0.25倍,最后通过 1 × 1 1 \times 1 1×1的卷积升维至原输入的通道数;MobileNet_v2则是先将输入的通道数升维至6倍,最后通过 1 × 1 1 \times 1 1×1的卷积降维至原输入的通道数。因为两者升降维顺序恰好相反,所以后者称为inverted residual。MobileNet_v2里升维的系数,也就是这里的6倍,称为expansion ratio,用于升维的这一个 1 × 1 1 \times 1 1×1卷积称为expansion layer因为之前提到在高维下ReLU保留的信息更完整,所以要先升维,防止ReLU在通道数少的情况下造成信息丢失。另外,要注意的是,这里的残差连接的是两个bottleneck,即通道数较小的两层,而原来的Residual block连接的是通道数较大的两层。至少在MobileNet里,前者设计的shortcut效果更好。

在这里插入图片描述

  再来和MobileNet_v1对比一下,MobileNet_v2多了一个 1 × 1 1 \times 1 1×1卷积,那参数量和计算量变大了吗?答:没有。因为MobileNet_v2的设计理念可以将输入和输出通道数大大降低,使得Multi-Adds、参数量以及运行时间都比MobileNet_v1少,并且准确率更高。

参考资料

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libtorch是一个用于C++的开源机器学习库,它是PyTorch框架的C++前端,可以在不依赖Python环境的情况下使用PyTorch的功能。它提供了一些用于构建、训练和部署深度学习模型的工具和接口。 MobileNet是一种轻量级的卷积神经网络模型,专门设计用于在移动设备和嵌入式系统上进行实时图像分类和目标检测。MobileNet_v2是对MobileNet的改进版本,通过引入更多的深度可分离卷积和倒残差结构,提高了模型的性能和效率。 使用libtorch和MobileNet_v2,我们可以在C++环境中构建、训练和部署目标检测或图像分类模型。首先,我们可以使用libtorch提供的工具将MobileNet_v2的模型定义加载到C++程序中。然后,我们可以使用该模型进行推理,对输入图像进行分类或目标检测,并获取相应的输出结果。 在使用libtorch和MobileNet_v2时,需要注意以下几点:首先,我们需要确保在环境中正确配置了libtorch库,并将其链接到我们的C++程序中。其次,我们可以根据具体的任务需求,使用MobileNet_v2的预训练模型或根据自己的数据集进行训练和微调。最后,我们可以使用libtorch提供的接口进行模型的推理和结果的处理。 总而言之,libtorch和MobileNet_v2的结合可以提供一个在C++环境中进行目标检测和图像分类的解决方案,使得我们可以在移动设备或嵌入式系统中部署高性能且轻量级的深度学习模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值