【第27篇】MobileNetV2:倒置残差和线性瓶颈

其中与在 R n R^{n} Rn 空间中一样,它通常会产生具有 n 个关节的分段线性曲线。

不难看出,一般来说,如果一个层变换的结果 ReLU(Bx) 的体积 S 非零,映射到内部 S 的点是通过输入的线性变换 B 得到的,因此表明对应于全维输出的输入空间仅限于线性变换。换句话说,深度网络仅在输出域的非零体积部分具有线性分类器的能力。我们参考补充材料以获得更正式的声明。

另一方面,当 ReLU 折叠通道时,它不可避免地会丢失该通道中的信息。但是,如果我们有很多通道,并且激活流形中有一个结构,那么信息可能仍会保留在其他通道中。在补充材料中,我们表明,如果输入流形可以嵌入到激活空间的显着低维子空间中,那么 ReLU 变换会保留信息,同时将所需的复杂性引入可表达的函数集

总而言之,我们强调了两个属性,这些属性表明感兴趣的流形应该位于高维激活空间的低维子空间中:

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

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

这两个见解为我们提供了优化现有神经架构的经验提示:假设感兴趣的流形是低维的,我们可以通过将线性瓶颈层插入卷积块来捕获这一点。 实验证据表明,使用线性层至关重要,因为它可以防止非线性破坏太多信息。 在第 6 节中,我们凭经验表明,在瓶颈中使用非线性层确实会降低几个百分点的性能,进一步验证了我们的假设。 我们注意到,在 [29] 中报告了有助于非线性的类似报告,其中非线性从传统残差块的输入中移除,从而提高了 CIFAR 数据集的性能。

在本文的其余部分,我们将使用瓶颈卷积。 我们将输入瓶颈的大小与内部大小之间的比率称为扩展比率。

image-20220128105334412

3.3、倒置残差


image-20220128105900850

瓶颈块看起来类似于残差块,其中每个块包含一个输入,然后是几个瓶颈,然后是扩展 [8]。 然而,受到瓶颈实际上包含所有必要信息的直觉的启发,而扩展层仅充当伴随张量非线性变换的实现细节,我们直接在瓶颈之间使用快捷方式。图 3 提供了示意图 设计差异的可视化。 插入快捷方式的动机类似于经典的残差连接:我们希望提高梯度在乘法器层中传播的能力。 然而,倒置设计的内存效率要高得多(详见第 5 节),并且在我们的实验中效果更好。

瓶颈卷积的运行时间和参数计数 基本实现结构如表 1 所示。对于大小为 h × w h \times w h×w、扩展因子为 t 和内核大小为 k 的块,具有 d ′ d^{\prime } d′ 个输入通道和 d ′ ′ d^{\prime \prime} d′′个输出通道,所需的乘加总数 是 h ⋅ w ⋅ d ′ ⋅ t ( d ′ + k 2 + d ′ ′ ) h \cdot w \cdot d^{\prime} \cdot t\left(d{\prime}+k{2}+d^{\prime \prime}\right) h⋅w⋅d′⋅t(d′+k2+d′′)。 与(1)相比,这个表达式有一个额外的项,因为我们确实有一个额外的 1 × 1 卷积,但是我们网络的性质允许我们使用更小的输入和输出维度。 在表 3 中,我们比较了 MobileNetV1、MobileNetV2 和 ShuffleNet 之间每种分辨率所需的大小。

3.4、信息流解读


我们架构的一个有趣特性是它提供了构建块(瓶颈层)的输入/输出域和层转换之间的自然分离——这是一种将输入转换为输出的非线性函数。前者可以看作是网络在每一层的容量,而后者可以看作是表现力。这与常规和可分离的传统卷积块形成对比,在传统卷积块中,表现力和容量都纠缠在一起,并且是输出层深度的函数。

特别是,在我们的例子中,当内层深度为 0 时,由于快捷连接,底层卷积是恒等函数。当扩展比小于 1 时,这是一个经典的残差卷积块 [8, 30]。然而,为了我们的目的,我们表明大于 1 的膨胀比是最有用的。

这种解释使我们能够将网络的表达能力与其容量分开研究,我们相信有必要进一步探索这种分离,以更好地理解网络属性。

4、模型架构

=================================================================

现在我们详细描述我们的架构。 如上一节所述,基本构建块是带有残差的瓶颈深度可分离卷积。 该块的详细结构如表 1 所示。MobileNetV2 的架构包含具有 32 个过滤器的初始全卷积层,随后是表 2 中描述的 19 个残差瓶颈层。由于其鲁棒性,我们使用 ReLU6 作为非线性 当与低精度计算一起使用时[27]。 我们始终使用现代网络的标准内核大小 3 × 3,并在训练期间利用 dropout 和批量归一化。

image-20220128111944480

除第一层外,我们在整个网络中使用恒定的扩展率。 在我们的实验中,我们发现在 5 到 10 之间的扩展率会导致几乎相同的性能曲线,较小的网络在扩展率稍低的情况下效果更好,而较大的网络在扩展率较大的情况下性能稍好。

对于我们所有的主要实验,我们使用 6 的扩展因子应用于输入张量的大小。 例如,对于采用 64 通道输入张量并产生具有 128 通道的张量的瓶颈层,则中间扩展层为 64×6 = 384 通道。

权衡超参数 如在 [27] 中,我们通过使用输入图像分辨率和宽度乘数作为可调超参数来定制我们的架构以适应不同的性能点,可以根据所需的精度/性能权衡进行调整。 我们的主网络(宽度乘法器 1,224 × 224)的计算成本为 3 亿次乘加,并使用了 340 万个参数。 我们探讨了性能权衡,输入分辨率从 96 到 224,宽度乘数从 0.35 到 1.4。 网络计算成本范围从 7 乘加到 585M MAdds,而模型大小在 1.7M 和 6.9M 参数之间变化。

与 [27] 的一个小的实现差异是,对于小于 1 的乘数,我们将宽度乘数应用于除最后一个卷积层之外的所有层。 这提高了较小模型的性能。

5、实施说明

=================================================================

5.1、内存高效推理


倒置残差瓶颈层允许实现特别高效的内存实现,这对于移动应用程序非常重要。使用例如 TensorFlow[31] 或 Caffe [32] 的标准高效推理实现构建了一个有向无环计算超图 G,由边组成 表示表示中间计算张量的操作和节点。 计划计算以最小化需要存储在内存中的张量总数。 在最一般的情况下,它搜索所有合理的计算顺序 Σ(G) 并选择最小化的。

M ( G ) = min ⁡ π ∈ Σ ( G ) max ⁡ i ∈ 1… n [ ∑ A ∈ R ( i , π , G ) ∣ A ∣ ] + size ⁡ ( π i ) M(G)=\min _{\pi \in \Sigma(G)} \max _{i \in 1 . . n}\left[\sum_{A \in R(i, \pi, G)}|A|\right]+\operatorname{size}\left(\pi_{i}\right) M(G)=π∈Σ(G)min​i∈1…nmax​⎣⎡​A∈R(i,π,G)∑​∣A∣⎦⎤​+size(πi​)

其中 R ( i , π , G ) R(i, \pi, G) R(i,π,G) 是连接到任何 π i … π n \pi_{i} \ldots \pi_{n} πi​…πn​节点的中间张量列表, ∣ A ∣ |A| ∣A∣表示张量 A 的大小,size(i) 是内部所需的内存总量 操作期间的存储 i。

对于仅具有平凡并行结构(例如残差连接)的图,只有一个非平凡的可行计算顺序,因此可以简化计算图 G 上推理所需的内存总量和界限:

M ( G ) = max ⁡ o p ∈ G [ ∑ A ∈ o p inp  ∣ A ∣ + ∑ B ∈ o p out  ∣ B ∣ + ∣ o p ∣ ] (2) M(G)=\max _{o p \in G}\left[\sum_{A \in \mathrm{op}_{\text {inp }}}|A|+\sum_{B \in \mathrm{op}_{\text {out }}}|B|+|o p|\right] \tag{2} M(G)=op∈Gmax​⎣⎡​A∈opinp ​∑​∣A∣+B∈opout ​∑​∣B∣+∣op∣⎦⎤​(2)

或者重申一下,内存量只是所有操作中组合输入和输出的最大总大小。 接下来我们将展示,如果我们将瓶颈残差块视为单个操作(并将内部卷积视为一次性张量),则内存总量将由瓶颈张量的大小决定,而不是由张量的大小决定 在瓶颈内部(并且更大)。

瓶颈残差块 图 3b 所示的瓶颈块算子 F(x) 可以表示为三个算子 F ( x ) = [ A ∘ N ∘ B ] x \mathcal{F}(x)=[A \circ \mathcal{N} \circ B] x F(x)=[A∘N∘B]x 的组合,其中 A 是线性变换 A : R s × s × k → R s × s × n \mathcal{A}: \mathcal{R}^{s \times s \times k} \rightarrow \mathcal{R}^{s \times s \times n} A:Rs×s×k→Rs×s×n,N 是一个非线性的每通道变换: N : R s × s × n → R s ′ × s ′ × n \mathcal{N}: \mathcal{R}^{s \times s \times n} \rightarrow \mathcal{R}{s{\prime} \times s^{\prime} \times n} N:Rs×s×n→Rs′×s′×n,B又是输出域的线性变换: B : R s ′ × s ′ × n → R s ′ × s ′ × k ′ \mathcal{B}: \mathcal{R}{s{\prime} \times s^{\prime} \times n} \rightarrow \mathcal{R}{s{\prime} \times s^{\prime} \times k^{\prime}} B:Rs′×s′×n→Rs′×s′×k′。

对于我们的网络 N = ReLU ⁡ 6 ∘ \mathcal{N}=\operatorname{ReLU} 6 \circ N=ReLU6∘ dwise ∘ ReLU ⁡ 6 \circ \operatorname{ReLU} 6 ∘ReLU6 ,但结果适用于任何每通道转换。 假设输入域的大小为 ∣ x ∣ |x| ∣x∣,输出域的大小为 ∣ y ∣ |y| ∣y∣,那么计算 F(X) 所需的内存可以低至 ∣ s 2 k ∣ + ∣ s ′ 2 k ′ ∣ + \left|s^{2} k\right|+\left|s^{\prime 2} k^{\prime}\right|+ ∣∣​s2k∣∣​+∣∣​s′2k′∣∣​+ O ( max ⁡ ( s 2 , s 2 ) ) O\left(\max \left(s^{2}, s^{2}\right)\right) O(max(s2,s2))。

该算法基于这样一个事实,即内部张量 I \mathcal{I} I可以表示为 t 个张量的串联,每个张量的大小为 n / t n/t n/t,然后我们的函数可以表示为

F ( x ) = ∑ i = 1 t ( A i ∘ N ∘ B i ) ( x ) \mathcal{F}(x)=\sum_{i=1}^{t}\left(A_{i} \circ N \circ B_{i}\right)(x) F(x)=i=1∑t​(Ai​∘N∘Bi​)(x)

通过累积总和,我们只需要一个大小为 n=t 的中间块始终保存在内存中。 使用 n/ t,我们最终不得不始终只保留一个中间表示的通道。 使我们能够使用此技巧的两个约束是(a)内部变换(包括非线性和深度方向)是每个通道的事实,以及(b)连续的非每个通道运算符具有显着的比率 输入到输出的大小。 对于大多数传统的神经网络,这种技巧不会产生显着的改进。

我们注意到,使用 t-way split 计算 F(X) 所需的乘加运算符的数量与 t 无关,但是在现有的实现中,我们发现用几个较小的矩阵乘法替换一个矩阵乘法会由于缓存增加而损害运行时性能 错过。 我们发现这种方法在 t 是 2 到 5 之间的一个小常数时最有帮助。它显着降低了内存需求,但仍然允许人们利用通过使用高度优化的矩阵乘法和卷积算子获得的大部分效率 由深度学习框架提供。 特殊的框架级别优化是否会导致进一步的运行时改进还有待观察。

6、实验

===============================================================

6.1、ImageNet 分类


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

image-20220127150726290

结果 我们将我们的网络与 MobileNetV1、ShuffleNet 和 NASNet-A 模型进行比较。 一些选定模型的统计数据如表 4 所示,完整的性能图如图 5 所示。

image-20220127150425012

6.2、物体检测


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

SSDLite:在本文中,我们介绍了常规 SSD 的移动友好型变体。我们用 SSD 预测层中的可分离卷积(深度后跟 1×1 投影)替换所有常规卷积。这种设计符合 MobileNets 的整体设计,并且被认为在计算上更加高效。我们将此修改后的版本称为 SSDLite。与常规 SSD 相比,SSDLite 显着减少了参数数量和计算成本,如表 5 所示。

image-20220127172030762

对于 MobileNetV1,我们遵循 [33] 中的设置。对于 MobileNetV2,SSDLite 的第一层附加到第 15 层的扩展(输出步长为 16)。 SSDLite 的第二层和其余层附加在最后一层之上(输出步幅为 32)。此设置与 MobileNetV1 一致,因为所有层都附加到相同输出步幅的特征图上。

6.3、语义分割


在本节中,我们将用作特征提取器的 MobileNetV1 和 MobileNetV2 模型与 DeepLabv3 [39] 进行移动语义分割任务的比较。 DeepLabv3 采用了 atrous 卷积 [40, 41, 42],这是一种显式控制计算特征图分辨率的强大工具,并构建了五个并行头,包括 (a) Atrous Spatial Pyramid Pooling module (ASPP) [43],其中包含三个 3 × 3 具有不同开口率的卷积,(b)1×1卷积头,和(c)图像级特征[44]。 我们用输出步幅表示输入图像空间分辨率与最终输出分辨率的比率,这是通过适当地应用空洞卷积来控制的。 对于语义分割,我们通常使用输出步幅 = 16 或 8 来获得更密集的特征图。 我们在 PASCAL VOC 2012 数据集 [3] 上进行实验,使用来自 [45] 的额外注释图像和评估指标 mIOU。

为了构建移动模型,我们尝试了三种设计变体:(1) 不同的特征提取器,(2) 简化 DeepLabv3 头部以加快计算速度,以及 (3) 不同的推理策略以提高性能。我们的结果总结在表 7 中。我们观察到:(a) 推理策略,包括多尺度输入和添加左右翻转图像,显着增加了 MAdd,因此不适合设备上的应用程序,(b) 使用output stride = 16 比 output stride = 8 更有效,© MobileNetV1 已经是一个强大的特征提取器,只需要比 ResNet-101 [8] 少大约 4.9 - 5.7 的 MAdds (例如,mIOU: 78.56 vs 82.70 和 MAdds:941.9B vs 4870.6B),(d)在 MobileNetV2 的倒数第二个特征图之上构建 DeepLabv3 头部比在原始最后一层特征图上构建 DeepLabv3 头更有效,因为倒数第二个特征map 包含 320 个通道而不是 1280 个通道,通过这样做,我们获得了类似的性能,但所需的操作比 MobileNetV1 对应物少了大约 2.5 倍。 (e) DeepLabv3 头的计算成本很高,并且移除 ASPP 模块显着减少了 MAdds只有轻微的表现e 退化。在表 7 的末尾,我们确定了设备上应用程序的潜在候选者(粗体),它达到 75.32% mIOU,并且只需要 2.75B MAdds。

6.4、消融研究


反向残差连接。 残差连接的重要性已被广泛研究 [8,30, 46]。 本文报告的新结果是,快捷连接瓶颈的性能优于连接扩展层的快捷方式(参见图 6b 进行比较)。

image-20220127180440345

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值