MobileNetV2论文精读(九):翻译+学习笔记+pytorch代码复现

前言

上一篇给大家精读了论文MobileNetV1版本,1.虽然dw能降低计算复杂度,但在训练的时候,大部分的卷积核的参数却为0,这样会损失一定的特征表达能力,2. ReLU 具有“硬截断”特性(负值直接置零),可能会导致信息损失,尤其是在低维特征空间中影响更大,3.由于没有使用残差连接(Residual Connection),MobileNetV1 在深层网络中可能会遇到梯度消失或特征流动受阻的问题,使得模型训练变得更加困难。

这次给大家带来MobileNet 系列的第二代,由 Google 在 2018 年提出,MobileNetV2 是一种轻量级的卷积神经网络,主要的创新点在于提出了倒残差结构+线性瓶颈(Linear Bottleneck)+深度可分离卷积,这样的结构组合,解决了V1版本的不足

我们一起来看一下吧!

代码讲解:B站 智算学术 

论文链接:MobileNetV2: Inverted Residuals and Linear Bottlenecks | IEEE Conference Publication | IEEE Xplore

领取500G深度学习资料,300多篇经典论文请关注作者公众号: 智算学术 回复:资料 领取

前景回顾

LeNet 论文精读 | 深度解析+PyTorch代码复现(上)_yann lecun卷积网络的奠定文章-优快云博客

LeNet 论文精读 | 深度解析+PyTorch代码复现(下)_lenet搭建与mnist训练-优快云博客

AlexNet 论文精读 | 深度解析+PyTorch代码复现 (上)-优快云博客

AlexNet 论文精读 | 深度解析+PyTorch代码复现 (下)-优快云博客

VGG论文精读 | 翻译+学习笔记+PyTorch代码复现_vgg官方论文-优快云博客

GoogleNet论文精读 | 翻译+学习笔记+PyTorch代码复现-优快云博客

MobileNetV1论文精读(八):翻译+学习笔记+pytorch代码复现-优快云博客

Abstract—摘要

翻译

在本文中,我们介绍了一种新的移动端网络架构 MobileNetV2,它在多个任务和基准测试上提升了移动模型的性能,并且适用于不同规模的模型。此外,我们提出了一种高效应用这些移动模型进行目标检测的新框架,称为 SSDLite。此外,我们展示了如何通过 DeepLabv3 的简化版本 Mobile DeepLabv3 构建移动端语义分割模型。

MobileNetV2 采用倒残差结构,其中跳跃连接连接的是窄瓶颈层。中间的扩展层使用轻量级深度可分离卷积来进行特征筛选,作为非线性的来源。此外,我们发现,在较窄的层中去除非线性激活函数对于保持模型的表达能力至关重要。这一策略提升了模型性能,并且我们提供了相关直觉来解释这一设计选择。

最终,我们的方法使得输入输出域与变换的表达能力解耦,从而提供了一个便于进一步分析的框架。我们在 ImageNet 分类任务、COCO 目标检测任务和 VOC 语义分割任务上评估了 MobileNetV2 的性能,并分析了准确率与计算量(以乘加操作数 MAdd 计量)、实际推理延迟以及参数数量之间的权衡。

精读

主要工作:

  1. 提出了采用倒残差结构的MobileNetV2网络

  2. 优化移动端目标检测模型(SSDLite):把SSD网络的主干网络替换为MobileNetV2网络,使得目标检测的新框架有很大提升

  3. 改进移动端语义分割模型(Mobile DeepLabv3):把DeepLabv3的主干网络替换为Mobile DeepLabv3 构建移动端语义分割模型

  4. 全面评估模型的性能与计算效率:在 ImageNet 分类、COCO 目标检测、VOC 语义分割等任务上测试了 MobileNetV2,并分析了计算量(MAdd)、延迟和参数量之间的权衡,证明了其高效性和实用性。

一、Introduction—介绍

翻译

神经网络已经彻底改变了许多机器智能领域,使其在复杂的图像识别任务上达到了超越人类的准确率。然而,提升准确率的过程中往往伴随着代价:现代最先进的网络通常需要高计算资源,超出了许多移动端和嵌入式应用的能力范围。

本文提出了一种专门为移动设备和资源受限环境设计的新型神经网络架构。该网络在保持相同准确率的同时,显著减少了计算量和内存需求,推动了移动端计算机视觉模型的性能提升。

我们的主要贡献是引入了一种新颖的层模块——倒残差结构(带线性瓶颈)。该模块首先接收一个低维压缩表示,将其扩展到高维后,使用轻量级深度可分离卷积进行特征提取,随后再通过线性卷积投影回低维表示。

该模块已在 TensorFlow-Slim 模型库中提供了官方实现,可以通过现代深度学习框架的标准操作高效实现,使得我们的模型在多个性能指标上超越了现有的先进方法。此外,这种卷积模块特别适用于移动端设计,因为它在推理过程中不会完全生成大型中间特征图,从而大幅减少了内存占用。这一特性降低了对主存的访问需求,使其在许多嵌入式硬件(通常仅提供少量高速缓存)上运行更加高效。

精读

1.遇到了什么问题? 现在的神经网络确实厉害,能在很多任务上超越人类,比如图像识别。但问题是,它们太吃计算资源了,普通的手机、嵌入式设备根本跑不动,计算量大、内存占用高,根本不适合移动端应用。

2.本论文主要贡献 这篇论文主要是解决上面的问题,专门为移动设备设计了一个更高效的网络 MobileNetV2。核心贡献就是 倒残差结构+线性瓶颈 这个新模块。简单来说,它先把低维数据扩展到高维,进行计算后再压缩回去,这样既能减少计算量,又能保持信息不丢失。而且整个设计不会产生很大的中间数据,这对移动端来说非常重要,能大幅减少内存占用。

3.效果如何? 这套方案非常成功,能在保持准确率的同时,大幅减少计算量和内存需求。而且,官方代码已经放到了 TensorFlow-Slim 里,任何现代深度学习框架都能用这个结构,结果就是 MobileNetV2 直接干翻了当时很多同类的移动端模型,效率更高,速度更快,特别适合手机、嵌入式设备这些计算资源有限的平台。

二、Related Work—相关工作

翻译

在过去的几年里,如何调整深度神经网络的架构,使其在准确率和计算性能之间达到最佳平衡,一直是一个热门研究方向。各个研究团队通过手动设计网络架构和改进训练算法,推动了这一领域的发展,使得早期的网络(如 AlexNet、VGGNet、GoogLeNet 和 ResNet)相比之下显得过时。

最近,自动化架构搜索取得了不少进展,包括超参数优化和网络剪枝等方法。此外,一些研究还探索了如何优化卷积块的连接结构,比如 ShuffleNet 采用的通道混洗技术,或者在网络中引入稀疏性等策略。同时,遗传算法和强化学习也被用于神经网络结构搜索,但这些方法的一个缺点是,最终得到的网络通常非常复杂。

本论文的目标是更深入地理解神经网络的工作方式,并利用这些直觉来设计尽可能简单的网络架构。与前面提到的复杂自动化搜索方法不同,我们的思路更接近 ShuffleNet 和其他结构优化方法,同时还能进一步提升性能,并更清晰地展现网络内部的运作方式。

我们的网络设计基于 MobileNetV1,继承了它的简洁性,不需要任何特殊算子,但在准确率上有了显著提升,在多个移动端的图像分类和目标检测任务上达到了当前最优的表现。

精读

1.常规的改进方法是什么?

手动架构设计、超参数优化、网络剪枝、改进卷积块的连接结构、引入稀疏性和其他优化算法(如遗传算法和强化学习)

2.我们工作的改进方法是什么?

基于MobileNetV1设计,保持简洁性

不需要特殊算子,专注于简化网络设计同时提升性能

三、Preliminaries, discussion and intuition—准备、讨论和直觉

3.1 Depthwise Separable Convolutions—深度可分离卷积

翻译

深度可分离卷积是许多高效神经网络架构的关键构建模块,我们在本研究中也使用了这种方法。基本的思想是将标准的卷积操作替换为一个分解版,将卷积过程拆分为两个独立的层。第一个层叫做深度卷积,它通过对每个输入通道应用一个卷积滤波器来执行轻量级的过滤操作。第二个层是一个1×1卷积,称为点卷积,负责通过计算输入通道的线性组合来构建新特征。

标准卷积操作接受一个大小为hi×wi×di的输入张量Li,并应用卷积核K∈Rk×k×di×dj来生成一个大小为hi×wi×dj的输出张量Lj。标准卷积层的计算成本是hi·wi·di·dj·k·k。深度可分离卷积可以作为标准卷积层的替代品,实际上它们几乎能和常规卷积一样工作,但计算成本要低得多。

这是深度卷积和1×1点卷积的总和。实际上,深度可分离卷积相比传统卷积层减少了计算量,约为传统层的k²倍。MobileNetV2使用k=3(即3×3的深度可分离卷积),因此计算成本比标准卷积小8到9倍,且准确率仅有轻微下降。

精读

深度可分离卷积的结构由两部分组成:(MobileNetV1论文已经讲过了,不懂的回看)

  1. 深度卷积:对每个输入通道应用一个独立的卷积滤波器,进行轻量级的过滤操作。

  2. 点卷积:通过1×1的卷积操作,将输入通道的线性组合生成新的特征。

    效果:计算成本比标准卷积小8到9倍,且准确率仅有轻微下降。

3.2 Linear Bottlenecks—线性瓶颈层

翻译

考虑一个由n层组成的深度神经网络,其中每层Li的激活张量维度为hi×wi×di。在本节中,我们将讨论这些激活张量的基本特性,我们将它们视为具有hi×wi个“像素”的容器,每个像素有di个维度。非正式地说,对于一组真实图像的输入,我们可以说层激活的集合(对于任何层Li)形成了一个“感兴趣的流形”。长期以来,人们一直认为神经网络中的感兴趣流形可以嵌入低维子空间。换句话说,当我们查看深度卷积层中的所有单独的d通道像素时,实际编码在这些值中的信息实际上位于某个流形中,而这个流形又可以嵌入到一个低维子空间。乍一看,这种情况似乎可以通过简单地降低层的维度来捕捉,从而减少操作空间的维度。这一思路已被MobileNetV1有效利用,通过宽度乘法器参数在计算和准确度之间进行权衡,并且也被其他网络的高效模型设计所采纳。根据这一直觉,宽度乘法器方法允许减少激活空间的维度,直到感兴趣的流形覆盖整个空间。然而,当我们回想起深度卷积神经网络实际上具有非线性的每坐标变换(如ReLU)时,这一直觉就会失效。例如,应用ReLU到1D空间中的一条直线时,结果是一个“射线”;而在Rn空间中,它通常会产生一个具有n个节点的分段线性曲线。我们可以很容易看出,通常情况下,如果一个层的变换结果ReLU(Bx)有一个非零体积S,则映射到S内部的点是通过输入的线性变换B获得的,这表明对应于完整维度输出的输入空间部分是受到线性变换的限制。换句话说,深度网络在输出域的非零体积部分只有作为线性分类器的能力。我们在补充材料中给出了更正式的表述。另一方面,当ReLU将通道压缩时,它不可避免地丢失了该通道的信息。然而,如果我们有很多通道,并且激活流形中存在某种结构,信息仍然可以保存在其他通道中。在补充材料中,我们展示了,如果输入流形能够嵌入到激活空间的一个显著低维子空间中,那么ReLU变换能够保留信息,同时将所需的复杂度引入可表达函数的集合。总结来说,我们突出了两个指示性特性,这些特性表明感兴趣的流形应位于高维激活空间的低维子空间中:

  1. 如果感兴趣的流形在ReLU变换后仍保持非零体积,则它对应于一个线性变换。

  2. ReLU能够保留输入流形的完整信息,但前提是输入流形位于输入空间的低维子空间中。

这两个见解为优化现有神经架构提供了一个经验上的提示:假设感兴趣的流形是低维的,我们可以通过在卷积块中插入线性瓶颈层来捕捉这一点。实验结果表明,使用线性层是至关重要的,因为它防止了非线性操作过度破坏信息。在第六节中,我们通过实验证明,瓶颈中的非线性层确实会导致性能下降几个百分点,进一步验证了我们的假设。我们注意到,类似的报告也曾出现在[29]中,在传统残差块的输入中移除了非线性,导致CIFAR数据集上的性能提高。在本文的其余部分,我们将使用瓶颈卷积。我们将输入瓶颈和内部尺寸之间的比例称为扩展比率。

精读

  1. relu函数存在的问题?

    在MobileNetV1中版本中,在训练的时候总是出现存在大量的卷积核的参数为0的情况,这里肯定存在信息丢失,那么是谁造成的呢,用实验论证这个问题。

    实验:先把2维的特征矩阵作为输入,然后升高维度N,N取不同值,然后经过relu函数,在然后降为到2维,发现relu对低维信息丢失严重,越高维信息越完整,如图所示

    从实验我们知道,越是高维,经过relu函数后信息越完整,那么我们的网络结构就可以按升维的思路来进行改进

  2. 改进深度可分离卷积结构

作者由上面的实验后改进的网络结构:

(a):标准卷积;(b):深度可分离卷积;(c):先用1x1升维处理--->经过3x3的DW-->1x1降维处理-->接激活函数; (d):和C图等价 也就是说在计算的时候我先进行升维处理,为了保留更多的信息,计算中我使用relu6作为激活函数,然后使用pw进行降维,降维后用线性函数作为激活函数

3.3 Inverted residuals—倒残差结构

翻译

瓶颈块看起来类似于残差块,每个块包含一个输入,后面跟着几个瓶颈层,再接着是扩展层。然而,受到直觉启发,认为瓶颈层实际上包含了所有必要的信息,而扩展层仅仅作为伴随张量非线性变换的实现细节,我们直接在瓶颈层之间使用跳跃连接。图3提供了设计差异的示意图。插入跳跃连接的动机与经典残差连接相似:我们希望改善梯度在多层之间传播的能力。然而,倒残差设计在内存效率上要高得多(详细信息见第5节),并且在我们的实验中稍微表现得更好。

瓶颈卷积的运行时间和参数数量:基本的实现结构如表1所示。对于一个大小为 h × w,扩展因子 t,卷积核大小为 k,输入通道为 d′,输出通道为 d′′ 的块,所需的乘加运算总数为 h · w · d′ · t(d′ + k² + d′′)。与公式 (1) 相比,这个表达式多了一项,因为我们有一个额外的 1 × 1 卷积,但是我们网络的结构使得我们能够使用更小的输入和输出维度。在表3中,我们比较了 MobileNetV1、MobileNetV2 和 ShuffleNet 在不同分辨率下所需的尺寸。

表1:瓶颈残差块,将通道从 k 转换到 k′,步幅为 s,扩展因子为 t。

表3,不同架构在每个空间分辨率下需要物化的最大通道数/内存(以Kb为单位)。我们假设激活值使用16位浮动数。在ShuffleNet中,我们使用2x,g = 3,以匹配MobileNetV1和MobileNetV2的性能。对于MobileNetV2和ShuffleNet的第一层,我们可以使用第5节中描述的技巧来减少内存需求。尽管ShuffleNet在其他地方使用了瓶颈结构,但由于非瓶颈张量之间存在快捷连接,这些非瓶颈张量仍然需要被物化。

精读

传统残差结构:

  • 输入 → 1 × 1 降维(可选) → 3 × 3 卷积 → 1 × 1 升维(可选) → 加上跳跃连接(shortcut) → ReLU 激活

  • 如果输入和输出的维度不同,需要使用1 × 1 卷积来调整维度,否则可以直接跳跃连接。

计算过程:

  1. 输入 X 经过若干卷积层(通常是 3 × 3)。

  2. 如果输入维度与输出不同,需要使用 1 × 1 卷积调整维度。

  3. 计算出的特征图 F(X)加上输入 X 本身:

    Y=F(X)+X

  4. 通过 ReLU 等非线性激活函数处理。

倒残差结构

输入 → 1 × 1 升维(扩展层) → 3 × 3 深度可分离卷积 → 1 × 1 降维(瓶颈层) → 残差连接(仅适用于特定情况)

其中 1 × 1 升维用于增加通道数,使得深度可分离卷积可以更高效地提取特征,而 1 × 1 降维则用于减少参数量。

计算流程

  1. 扩展层(Expansion Layer)

    • 用 1 × 1 卷积把低维输入扩展到更高维度,提高特征表达能力。

  2. 深度可分离卷积(Depthwise Separable Convolution)

    • 先进行深度卷积(Depthwise Convolution),对每个通道单独进行卷积操作。

    • 再进行点卷积(Pointwise Convolution)(1 × 1 卷积),将不同通道的信息融合。

  3. 瓶颈层(Projection Layer)

    • 再次使用 1 × 1 卷积,把高维度特征映射回低维度。

  4. 跳跃连接(Shortcut Connection)仅适用于输入和输出维度相同的情况):

    • 由于倒残差块的输入维度较低,跳跃连接发生在低维瓶颈层,而不是高维通道层(传统残差块是在高维通道层进行连接)。

3.4 Information flow interpretation—信息流解释

翻译

我们架构的一个有趣特性是,它在构建块(瓶颈层)的输入/输出域和层变换之间提供了自然的分离——即将输入转换为输出的非线性函数。前者可以看作是网络在每一层的容量,而后者则是表达能力。这与传统的卷积块(包括常规卷积和深度可分离卷积)不同,传统卷积块中,表达能力和容量是混合在一起的,并且都是输出层深度的函数。具体来说,在我们的架构中,当内部层深度为0时,底层卷积是恒等函数,这是由于快捷连接的存在。当扩展比例小于1时,这就是经典的残差卷积块。然而,对于我们的目的,我们证明扩展比例大于1是最有用的。这种解释使我们能够将网络的表达能力与其容量分开进行研究,我们认为进一步探索这种分离是有必要的,这有助于更好地理解网络的属性。

精读

1.传统的卷积机理:

在做一次卷积过程中,既做了特征提取,也做了数据信息传递,是混杂在一起的,即表达能力和容量是混在一起的(这是我自己的理解)

  1. 倒残差结构

    先做特征提取,后做数据信息传递,这里是分离的

    容量指的是网络能处理多少信息,比如每一层能接受多少输入和输出。

    表达能力指的是网络能处理信息的复杂度,具体来说,就是网络能从输入信息中提取多少复杂的模式或特征。

四、Model Architecture—模型架构

翻译

现在我们详细描述我们的架构。如前一节所述,基本构建块是带有残差连接的瓶颈深度可分离卷积。该模块的详细结构如表 1 所示。MobileNetV2 的整体架构包括一个初始的全卷积层(具有 32 个滤波器),后面接着 19 个残差瓶颈层(详见表 2)。我们选择 ReLU6 作为非线性激活函数,因为它在低精度计算(如量化计算)时具有更强的鲁棒性 [27]。整个网络始终采用 3 × 3 的卷积核,这已经成为现代神经网络的标准,同时在训练过程中使用 Dropout 和批量归一化(Batch Normalization)来提高泛化能力。

除了第一个卷积层外,整个网络保持固定的扩展率。在实验中,我们发现扩展率在 5 到 10 之间时,网络的性能曲线几乎相同。对于较小的网络,稍小的扩展率效果更好,而较大的网络在较高的扩展率下表现稍优。我们在主要实验中采用扩展因子 6,即每个瓶颈层的中间通道数是输入通道数的 6 倍。例如,对于一个输入通道数为 64,输出通道数为 128 的瓶颈层,其扩展层(Expansion Layer)的通道数计算如下:64 × 6 = 384。

与 [27] 相似,我们针对不同的性能需求调整网络架构,主要通过输入图像分辨率和宽度乘子(Width Multiplier)两个超参数来调节网络的精度和性能权衡。我们的主模型(宽度乘子为 1,输入分辨率为 224 × 224)具有 3 亿次乘加运算(Multiply-Adds, MAdds),参数量为 3.4M(340 万)。

我们探索了不同输入分辨率(96 到 224)和不同宽度乘子(0.35 到 1.4)下的性能权衡。在这些实验中,计算量范围从 7M MAdds 到 585M MAdds,模型参数范围从 1.7M 到 6.9M。

此外,与 [27] 相比,我们的一个细微实现差异是,当宽度乘子小于 1 时,我们对所有层(除了最后一个卷积层)应用宽度乘子。这一调整使得较小的模型在精度上有更好的表现。

精读

网络结构参数表:

t:扩展因子(即升维倍数),一般与输入的通道数相乘;c:输出通道数(也是卷积核个数);n:该层重复次数;s:步幅,注意,shortcut只在s=1并且与输入特征矩阵的尺寸一致才会捷径连接;

1.整个架构包括第一层 32 通道的初始全卷积层,后接 19 个瓶颈层

2.ReLU6 作为激活函数,提高了低精度计算的鲁棒性。网络采用 3×3 卷积核,并在训练中使用 Dropout 和批量归一化

3.除第一层外,网络扩展率t固定,实验表明扩展率在 5 到 10 之间性能相近,默认是6

网络支持输入分辨率和宽度乘子调节性能。主模型(224×224,宽度乘子 1)计算量 3 亿次 MAdds,参数量 3.4M。实验测试了分辨率 96-224、宽度乘子 0.35-1.4,计算量 7M-585M MAdds,参数量 1.7M-6.9M。

一个优化点:是当宽度乘子小于 1 时,对所有层(除最后一层)应用乘子,提高了小模型的表现。

五、Implementation Notes—实现细节说明

5.1 Memory efficient inference—高效推理内存

翻译

倒残差瓶颈层允许实现特别高效的内存利用,这对于移动端应用至关重要。

在推理过程中,使用 TensorFlow [31] 或 Caffe [32] 等框架的标准高效实现通常会构建一个有向无环计算超图 G,其中边表示计算操作,节点表示中间计算过程中产生的张量。

计算调度的目标是最小化需要存储在内存中的张量总数。在最一般的情况下,这一过程会在所有可能的计算顺序 Σ(G) 中进行搜索,并选择能够最小化内存占用的计算顺序。

其中,R(i, π, G) 表示与节点 πi 到 πn 之间连接的所有中间张量列表,|A| 表示张量 A 的大小,而 size(i) 表示操作 i 期间内部存储所需的总内存量。

对于仅包含简单并行结构(如残差连接)的计算图来说,通常只有一个非平凡的可行计算顺序,因此,计算图 G 在推理过程中所需的总内存量及其上界可以简化。

换句话说,所需的内存量简单来说就是所有操作中输入和输出张量总大小的最大值。接下来,我们将展示,如果将一个瓶颈残差块视为单个操作(并将内部卷积视为可丢弃的张量),那么总内存消耗主要受瓶颈张量的大小支配,而不是瓶颈内部那些更大的中间张量。

瓶颈残差块的算子 F(x)(如图 3b 所示)可以表示为三个算子的组合:F(x) = [A ◦ N ◦ B]x,其中 A 是一个线性变换,表示为 A : Rs×s×k → Rs×s×n;N 是一个非线性的逐通道变换,表示为 N : Rs×s×n → Rs′×s′×n;B 也是一个线性变换,表示为 B : Rs′×s′×n → Rs′×s′×k′。

在我们的网络中,N 由 ReLU6、深度可分离卷积(dwise)和 ReLU6 组成,但这个公式适用于任何逐通道变换。假设输入域的大小为 |x|,输出域的大小为 |y|,那么计算 F(x) 所需的内存最低可以达到 |s²k| + |s′²k′| + O(max(s², s′²))。

该算法的核心思想是,内部张量 I 可以表示为 t 个张量的拼接,每个张量的大小为 n/t,因此,我们的函数可以被重新表示为:

通过累加求和,我们只需要在内存中始终保留一个大小为 n/t 的中间块。若取 n = t,则在任意时刻只需保留中间表示的单通道数据。这种优化技巧依赖于两个关键条件:(a) 内部变换(包括非线性和深度可分离卷积)是逐通道的,(b) 相邻的非逐通道运算的输入尺寸和输出尺寸之间存在较大的比例关系。对于大多数传统神经网络而言,这种技巧并不会带来显著的优化效果。

值得注意的是,使用 t 路拆分计算 F(X) 时,所需的乘加运算总量与 t 无关。然而,在实际实现中,我们发现将一次大规模矩阵乘法拆分为多个小规模矩阵乘法会导致更多的缓存未命中,从而影响运行时性能。实验表明,当 t 取 2 到 5 之间的较小常数时,该方法最有效。它显著降低了内存需求,同时仍然可以利用深度学习框架提供的高度优化的矩阵乘法和卷积运算的计算优势。是否能通过特殊的框架级优化进一步提升运行时性能,还有待进一步研究。

精读

  1. 神经网络的计算过程被表示成一个 计算图,这个图由 "节点"(表示计算数据的张量)"边"(表示计算操作) 组成,中间张量(扩展层的高维特征) 可以在计算完成后立即释放,不需要长期占用内存。但是,输入和输出的张量 需要在多个计算模块之间传递,不能随意释放,因此它们对总内存占用的影响最大。如果把 一个瓶颈残差块 视为一个整体操作,而不是单独考虑它内部的每个计算步骤(比如卷积),那么 实际需要占用的内存主要由输入和输出的张量大小决定,而不是中间过程的张量大小

这样做的好处是:可以 降低模型运行时的内存占用,对 移动设备 这样的资源受限环境特别重要。

  1. 剩下部分是说,如何用更少的内存高效计算瓶颈残差块

核心思路:不要一次性存太多中间数据,而是按小块处理,计算完一部分再换下一部分。

具体做法:

  1. 瓶颈残差块的计算分成 三步扩展通道 → 逐通道计算 → 压缩通道)。

  2. 计算过程中会生成一个 很大的中间结果,但我们可以把它 拆成小块 存储,而不是一次性存下全部。

  3. 只在计算时保留一部分数据,用完就丢,不让大块数据一直占内存。

这样,内存占用大大减少,但计算量不变,还能保持高效运算!

六、Experiments—实验

6.1 ImageNet Classification—ImageNet数据集分类

翻译

训练设置:我们使用 TensorFlow 来训练我们的模型。我们使用标准的 RMSPropOptimizer,动量和衰减都设置为 0.9。每一层后使用批量归一化,权重衰减设置为 0.00004。按照 MobileNetV1 的设置,我们使用初始学习率 0.045,学习率衰减率为每个 epoch 0.98。我们使用 16 个 GPU 异步工作者,批量大小为 96。

结果:我们将我们的网络与 MobileNetV1、ShuffleNet 和 NASNet-A 模型进行了比较。表 4 显示了几个选定模型的统计数据,完整的性能图表见图 5。

精读

框架: TensorFlow

优化器: RMSPropOptimizer

  • 动量: 0.9

  • 衰减: 0.9

批量归一化: 每一层后使用

权重衰减: 0.00004

初始学习率: 0.045

学习率衰减率: 每个 epoch 衰减 0.98

GPU : 16

批量大小: 96

结论:MobileNetV2比MobileNetV1性能提高很多

6.2 Object Detection—目标检测

翻译

我们评估并比较了 MobileNetV2 和 MobileNetV1 作为特征提取器 [33] 在 COCO 数据集 [2] 上使用修改版的单次检测器(SSD)[34] 进行目标检测的性能。我们还与 YOLOv2 [35] 和原始 SSD(以 VGG-16 [6] 作为基础网络)作为基准进行了比较。由于我们的重点是移动端/实时模型,因此没有与其他架构(如 Faster-RCNN [36] 和 RFCN [37])进行性能比较。

SSDLite:在本文中,我们引入了一种移动友好的版本的常规 SSD。我们将所有常规卷积替换为可分离卷积(深度可分离卷积后接 1×1 投影),应用于 SSD 的预测层。这一设计与 MobileNets 的整体设计一致,计算效率显著提高。我们将这种修改版称为 SSDLite。与常规 SSD 相比,SSDLite 显著减少了参数量和计算成本,如表 5 所示。

对于 MobileNetV1,我们遵循 [33] 中的设置。对于 MobileNetV2,SSDLite 的第一层连接到第 15 层的扩展部分(输出步幅为 16)。第二层及之后的 SSDLite 层则连接到最后一层(输出步幅为 32)。这一设置与 MobileNetV1 一致,因为所有层都连接到具有相同输出步幅的特征图。

两个 MobileNet 模型都使用开源的 TensorFlow 目标检测 API [38] 进行训练和评估。两个模型的输入分辨率都是 320 × 320。我们基准测试并比较了 mAP(COCO 挑战指标)、参数数量和乘加运算数量。结果如表 6 所示。MobileNetV2 SSDLite 不仅是最有效的模型,而且是三者中最准确的。值得注意的是,MobileNetV2 SSDLite 在效率上比 YOLOv2 高 20 倍,且参数量小 10 倍,同时在 COCO 数据集上仍然优于 YOLOv2。

精读

论文中还介绍了一个针对移动设备优化的 SSD 变种——SSDLite,使用了深度可分离卷积来替代常规卷积,显著提高了计算效率。SSDLite 在减少参数量和计算成本方面表现突出。

MobileNetV2 SSDLite 在准确性和效率上都优于其他模型,特别是在 COCO 数据集上,它不仅比 YOLOv2 更高效,且模型尺寸小 10 倍,计算效率提高了 20 倍,同时保持了较高的准确性。

6.3 Semantic Segmenta tion—语义分割

翻译

在这一部分,我们将 MobileNetV1 和 MobileNetV2 模型作为特征提取器,与 DeepLabv3 一起用于移动语义分割任务进行比较。DeepLabv3 采用了空洞卷积(atrous convolution),这是一种强大的工具,可以显式控制计算特征图的分辨率,并构建了五个并行的头,包括:(a)空洞空间金字塔池化模块(ASPP),包含三个具有不同空洞率的 3 × 3 卷积,(b)1 × 1 卷积头,以及(c)图像级特征。我们用输出步幅(output stride)表示输入图像空间分辨率与最终输出分辨率的比率,这通过正确应用空洞卷积来控制。对于语义分割,通常使用输出步幅 = 16 或 8 来获得更密集的特征图。我们在 PASCAL VOC 2012 数据集上进行了实验,并使用来自 [45] 的额外标注图像,评估指标为 mIOU。

为了构建一个适用于移动设备的模型,我们进行了三种设计变化的实验:(1)不同的特征提取器,(2)简化 DeepLabv3 的头部以加速计算,(3)不同的推理策略以提高性能。我们的结果总结在表 7 中。我们观察到:(a)推理策略,包括多尺度输入和加入左右翻转的图像,显著增加了乘加运算(MAdds),因此不适用于设备端应用;(b)使用输出步幅 = 16 比输出步幅 = 8 更高效;(c)MobileNetV1 已经是一个强大的特征提取器,仅需要比 ResNet-101 少约 4.9 到 5.7 倍的 MAdds(例如,mIOU:78.56 与 82.70,MAdds:941.9B 与 4870.6B);(d)在 MobileNetV2 的倒数第二个特征图上构建 DeepLabv3 的头部,比在原始最后一层特征图上构建要高效,因为倒数第二个特征图包含 320 个通道,而不是 1280 个,通过这种方式,我们可以获得相似的性能,但比 MobileNetV1 的对应模型需要大约 2.5 倍更少的操作;(e)DeepLabv3 的头部计算开销较大,去除 ASPP 模块显著减少了 MAdds,且只带来轻微的性能下降。表 7 末尾,我们标出了适合设备端应用的潜在候选模型(加粗显示),该模型实现了 75.32% 的 mIOU,并且仅需要 2.75B MAdds。

精读

这部分内容比较了 MobileNetV1 和 MobileNetV2 在移动设备语义分割中的表现。主要发现包括:多尺度输入和翻转图像增加了计算量,不适合设备端使用;输出步幅为 16 比 8 更高效;MobileNetV1 比 ResNet-101 更节省计算量;在 MobileNetV2 上使用倒数第二层特征图比最后一层更高效;去除 ASPP 模块减少计算量,但性能下降很小。最终,标出了最适合设备端应用的高效模型。

6.4 Ablation study—消融研究

翻译

倒残差连接。残差连接的重要性已经被广泛研究[8, 30, 46]。本文报道的新结果是,连接瓶颈层的捷径比连接扩展层的捷径效果更好(请参见图 6b 进行比较)。

线性瓶颈的重要性。线性瓶颈模型的表现严格不如具有非线性激活函数的模型,因为激活函数可以通过适当调整偏置和缩放来始终在线性范围内工作。然而,我们在图 6a 中的实验表明,线性瓶颈能提升性能,这支持了非线性激活函数会破坏低维空间中的信息的观点。

精读

倒残差连接:研究发现,把捷径连接放在瓶颈层(即中间层)效果比放在扩展层更好。

线性瓶颈:虽然线性瓶颈模型没有非线性模型强大,但实验表明,线性瓶颈能够提高性能,说明非线性会在低维空间中破坏信息。

七、Conclusions and future work—总结和未来工作

翻译

我们描述了一个非常简单的网络架构,使我们能够构建一系列高效的移动模型。我们的基本构建单元具有几个特别适合移动应用的特点。它支持非常节省内存的推理,并利用所有神经网络框架中都存在的标准操作。在 ImageNet 数据集上,我们的架构在多个性能点上提升了现有的最先进技术。在目标检测任务中,我们的网络在 COCO 数据集上超越了现有的实时检测器,既在准确性上,也在模型复杂度上都表现更好。值得注意的是,我们的架构结合 SSDLite 检测模块,在计算量和参数量上分别比 YOLOv2少了 20 倍和 10 倍。在理论方面:所提出的卷积块具有一个独特的性质,可以将网络的表达能力(通过扩展层表示)与其容量(通过瓶颈输入表示)分开,探索这一点是未来研究的重要方向。

精读

以下是总结的要点:

  1. 网络架构特点

    • 提供高效的内存利用和推理性能,适合移动应用。

    • 使用简单的网络单元和标准操作,确保高效性。

  2. ImageNet 数据集上的表现

    • 在多个性能点上超过现有技术,提升了状态的艺术。

  3. 目标检测任务上的表现

    • 在 COCO 数据集上,比现有的实时检测器(如 YOLOv2)更高效。

    • 计算量和参数量分别减少了 20 倍和 10 倍。

  4. SSDLite 模块

    • 结合该模块时,表现出色,既能提高准确性,又能减少模型复杂度。

  5. 卷积块的独特性质

    • 提出的卷积块可以将网络的表达能力与容量分开,这为未来的研究提供了一个重要方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值