《A ConvNet for the 2020s》阅读笔记

news2024/11/20 22:39:57

论文标题

《A ConvNet for the 2020s》

面向 2020 年代的 ConvNet

作者

Zhuang Liu、Hanzi Mao、Chao-Yuan Wu、Christoph Feichtenhofer、Trevor Darrell 和 Saining Xie

来自 Facebook AI Research (FAIR) 和加州大学伯克利分校

初读

摘要

  • “ViT 盛 Conv 衰” 的现状:

    • 视觉识别的 “咆哮的20年代” 始于 Vision Transformers(ViTs)的引入,ViTs 迅速取代了 ConvNets,成为最先进的图像分类模型。
    • 然而,一个普通的 ViT 在应用于通用计算机视觉任务时,例如目标检测和语义分割,会遇到困难。
      • 是分层 Transformers(例如,Swin Transformers)重新引入了几个 ConvNet 先验,使 Transformers 实际上可以作为通用的视觉骨干,并在各种视觉任务上展示了卓越的性能。
      • 然而,这种混合方法的有效性在很大程度上还是归功于 Transformers 的内在优越性,而不是卷积的固有归纳偏置。
  • 重振 Conv 雄风:

    • 在这项工作中,我们重新审视了设计空间,并测试了纯 ConvNet 能实现的上限。

    • 我们逐渐将标准的 ResNet “现代化”为视觉 Transformer 的设计,并在过程中发现了一些对性能差异有贡献的关键组件。

    • 这一探索的结果是一系列纯 ConvNet 模型,名为 ConvNeXt。

      完全由标准的 ConvNet 模块构建,ConvNeXts 在准确性和可扩展性方面与 Transformers 竞争,

      • 实现了 87.8% 的 ImageNet top-1 准确率,
      • 并在 COCO 检测和 ADE20K 分割上超过了 Swin Transformers,
      • 同时保持了标准 ConvNets 的简洁和高效。

结论

  • 在2020年代,视觉 Transformer,尤其是分层 Transformer 如 Swin Transformers,开始超越 ConvNets,成为通用视觉骨干的首选。普遍的观点是,视觉 Transformer 比 ConvNets 更准确、更高效、更具有可扩展性。
  • 我们提出了 ConvNeXts,这是一个纯 ConvNet 模型,它可以在多个计算机视觉基准测试中与最先进的分层视觉 Transformer 竞争,同时保留了标准 ConvNets 的简洁和高效。
  • 从某些方面来说,我们的观察结果是令人惊讶的,而我们的 ConvNeXt 模型本身并不是全新的——许多设计选择在过去十年中都有分别被研究过,但并没有被综合起来。
  • 我们希望本研究报告的新结果将挑战几个普遍持有的观点,并促使人们重新思考卷积在计算机视觉中的重要性。

再读

Section 1 Introduction

  • 卷积历史回顾:2010s

    回顾 2010 年代,这个十年被深度学习的巨大进步和影响所标记。主要的推动力是神经网络的复兴,特别是卷积神经网络(ConvNets)。

    • 在整个十年中,视觉识别领域成功地从工程特征转变到了设计(ConvNet)架构。
    • 尽管反向传播训练的 ConvNets 的发明可以追溯到 1980 年代,但直到 2012 年末,我们才看到了它在视觉特征学习方面的真正潜力。
    • AlexNet 的引入预示了“ImageNet 时刻”,开启了一个计算机视觉的新时代。此后,该领域以快速的速度发展。
    • 代表性的 ConvNets 如 VGGNet、Inceptions、ResNe(X)t、DenseNet、MobileNet、EfficientNet 和 RegNet 专注于准确度、效率和可扩展性的不同方面,并普及了许多有用的设计原则。
  • 卷积的核心竞争力:滑动窗口

    • ConvNets 在计算机视觉中的全面主导地位并非巧合:在许多应用场景中,"滑动窗口(sliding window)"策略是视觉处理固有的,特别是在处理高分辨率图像时。
    • ConvNets 具有多种内置的归纳偏置,使它们适用于广泛的计算机视觉应用。
      • 最重要的一个是平移等方差,这是对象检测等任务所希望具有的性质。
      • 由于在以滑动窗口方式使用时,计算是共享的,因此 ConvNets 在本质上也是高效的。
    • 多年来,这一直是 ConvNets 的默认使用方式,通常用于有限的对象类别,如数字、面部和行人。进入2010年代,基于区域的检测器进一步提升了 ConvNets 作为视觉识别系统基本构建块的地位。
  • Attention is all your need

    • 大约在同一时间,自然语言处理(NLP)的神经网络设计历程走上了截然不同的道路,因为 Transformer 取代了循环神经网络,成为主导的骨干架构。
    • 尽管语言和视觉领域感兴趣的任务存在差异,但两条路径在 2020 年惊人地汇合了,Vision Transformers(ViT)的引入完全改变了网络架构设计的格局。
      • 除了最初的“切块”层,它将图像分割成一系列的块之外,ViT 没有引入任何特定的图像归纳偏置,并且对原始 NLP Transformer 的结构改动最小。
      • ViT的一个主要关注点是缩放行为:在更大的模型和数据集大小的帮助下,Transformer 可以显著超越标准的 ResNets。这些在图像分类任务上的结果是鼓舞人心的,但计算机视觉并不仅限于图像分类。
    • 如前所述,过去十年中许多计算机视觉任务的解决方案在很大程度上依赖于滑动窗口、全卷积的范式。没有 ConvNet 的归纳偏置,一个普通的 ViT 模型在作为通用视觉骨干时面临着许多挑战。最大的挑战是 ViT 的全局注意力设计,它与输入大小成二次方复杂度。这对于 ImageNet 分类可能是可以接受的,但在处理更高分辨率的输入时,很快就变得难以处理。
  • Transformer + 滑动窗口

    • 分层 Transformer 采用了一种混合方法来弥合这一差距。例如,“滑动窗口”策略(例如,在局部窗口内的注意力)被重新引入到Transformer中,使它们的行为更加类似于ConvNets。
    • Swin Transformer 是这方面的一个里程碑工作,它首次证明了 Transformer 可以被采纳为通用的视觉骨干,并在超越图像分类的计算机视觉任务范围内实现最先进的性能。
    • Swin Transformer 的成功和快速采纳也揭示了一件事:卷积的本质并没有变得无关紧要;相反,它仍然非常需要,并且从未减弱。
  • 自注意力很好但是很贵

    • 从这个角度来看,许多 Transformer 在计算机视觉方面的进步都是旨在恢复卷积。然而,这些尝试是有代价的:
      • 滑动窗口自注意力的简单实现可能非常昂贵;
      • 使用高级方法,如循环移位,可以优化速度,但系统设计变得更加复杂。
    • 另一方面,几乎具有讽刺意味的是,ConvNet 已经以直接、朴素的方式满足了许多那些期望的特性。ConvNet 看似失去动力的唯一原因是因为(分层)Transformers 在许多视觉任务上超越了它们,而性能差异通常归因于 Transformers 的优越缩放行为,其中多头自注意力是关键组件。
  • 本文工作

    • 与过去十年中逐步改进的 ConvNets 不同,Vision Transformers 的采用是一种阶跃变化。在最近的文献中,当比较两者时,通常采用系统级比较(例如,Swin Transformer 与 ResNe t的比较)。ConvNets 和分层视觉 Transformers 同时变得不同和相似:它们都配备了类似的归纳偏置,但在训练过程以及宏观/微观层面的架构设计上存在显著差异。在这项工作中,我们研究了 ConvNets 和 Transformers 之间的架构差异,并尝试在比较网络性能时识别混淆变量。我们的研究旨在弥合 ConvNets 在 ViT 之前和之后的时代之间的差距,同时也测试纯 ConvNet 能实现的上限
    • 为了做到这一点,我们从使用改进过程训练的标准 ResNet(例如 ResNet-50)开始。我们逐渐将架构“现代化”为分层视觉 Transformer(例如 Swin-T)的构建。我们的探索是由一个关键问题指导的:Transformers 中的设计决策如何影响 ConvNets 的性能?在这个过程中,我们发现了一些对性能差异有贡献的关键组件。因此,我们提出了一系列纯 ConvNets,命名为 ConvNeXt。
    • 我们在各种视觉任务上评估 ConvNeXts,如 ImageNet 分类、COCO 上的目标检测/分割以及 ADE20K 上的语义分割。令人惊讶的是,完全由标准 ConvNet 模块构建的 ConvNeXts 在所有主要基准测试中在准确性、可扩展性和鲁棒性方面与 Transformers 竞争。ConvNeXt 保持了标准 ConvNets 的效率,而训练和测试的完全卷积性质使其实现起来极其简单。
    • 我们希望新的观察和讨论能够挑战一些普遍的观念,并鼓励人们重新思考卷积在计算机视觉中的重要性。

Section 2 Modernizing a ConvNet: a Roadmap

现代化 ConvNet:路线图

  • 在本节中,我们提供了一个从 ResNet 到与 Transformer 相似的 ConvNet 的轨迹。

  • 我们考虑了两种模型大小,以 FLOPs(浮点运算次数)来衡量,

    • 一种是 ResNet-50 / Swin-T 级别,FLOPs 大约为 4.5 × 1 0 9 4.5\times10^9 4.5×109
    • 另一种是 ResNet-200 / Swin-B 级别,FLOPs 大约为 15.0 × 1 0 9 15.0\times10^9 15.0×109
    • 为了简单起见,我们将使用 ResNet-50 / Swin-T 复杂度的模型来展示结果。对于更高容量模型的结论是一致的,结果可以在附录 C 中找到。
  • 在高级别上,我们的探索旨在调查和遵循不同级别的 Swin Transformer 设计,同时保持网络的简洁性,作为一个标准的 ConvNet。我们的探索路线图如下。

    • 我们的起点是 ResNet-50 模型。我们首先使用与训练视觉 Transformer 相似的训练技术来训练它,并与原始 ResNet-50 相比获得明显改善的结果。这将成为我们的基线。

    • 然后我们研究了一系列设计决策,我们将其总结为:

      • 宏观设计,
      • ResNeXt,
      • 倒置瓶颈,
      • 大内核尺寸,
      • 各种逐层的微观设计。
    • 在图 2 中,我们展示了“网络现代化”每一步的过程和我们能够实现的结果。由于网络复杂性与其最终性能密切相关,因此在探索过程中大致控制了 FLOPs,尽管在中间步骤中 FLOPs 可能高于或低于参考模型。

      在这里插入图片描述

      • 图片注解:图 2 我们将在不引入任何基于注意力的模块的情况下,将标准的卷积神经网络(ResNet)现代化,趋向于分层视觉 Transformer(Swin)的设计。
        • 图中前景的条形图显示了 ResNet-50/Swin-T FLOP范围内的模型准确度;灰色条形图显示了 ResNet-200/Swin-B 范围的结果。带阴影的条形图意味着该修改没有被采用。两个范围的详细结果都在附录中。
        • 许多 Transformer 的架构选择可以被融入 ConvNet 中,并且它们导致性能逐渐提高。
        • 最终,我们的纯 ConvNet 模型,命名为 ConvNeXt,能够超越 Swin Transformer。
  • 所有模型都在 ImageNet-1K 上进行训练和评估。

2.1.Training Techniques

训练技巧

  • 除了网络架构的设计,训练过程也影响着最终的绩效。
    • 视觉 Transformer 不仅带来了一套新的模块和架构设计决策,还引入了不同的训练技术(例如 AdamW 优化器)到视觉领域。
    • 这主要涉及优化策略和相关超参数设置。因此,我们探索的第一步是使用视觉 Transformer 的训练过程来训练一个基线模型,在本例中为 ResNet50/200。
  • 最近的研究表明,一套现代训练技术可以显著提高简单 ResNet-50 模型的性能。在我们的研究中,我们使用了一种接近 DeiT 和 Swin Transformer 的训练方案。
    • 训练从原来的 90 个周期延长到 300 个周期。
    • 我们使用 AdamW 优化器,数据增强技术如 Mixup、Cutmix、RandAugment、Random Erasing,以及包括 Stochastic Depth 和 Label Smoothing 在内的正则化方案。
    • 我们使用的完整超参数集可以在附录A.1中找到。
  • 仅凭这种增强的训练方案,ResNet-50 模型的性能就从 76.1% 提升到了 78.8% (+2.7%),这意味着传统 ConvNets 与视觉 Transformers 之间的性能差异可能很大程度上是由于训练技术造成的。
  • 我们将使用这个固定的训练方案和相同的超参数贯穿整个“现代化”过程。在 ResNet-50 范围内的每个报告的准确率都是使用三个不同随机种子训练得到的平均值。

2.2.Macro Design

宏观设计

  • 改变阶段计算比例(Changing stage compute ratio)
    • ResNet 中原始设计的计算分布跨阶段主要是经验性的。大重量的“res4”阶段旨在与下游任务(如目标检测)兼容,其中检测器头在 14 × 14 14\times14 14×14 特征平面上操作。
    • 另一方面,Swin-T 遵循相同的原理,但阶段计算比略有不同,为 1 : 1 : 3 : 1 1:1:3:1 1:1:3:1。对于更大的 Swin Transformers,比例为 1 : 1 : 9 : 1 1:1:9:1 1:1:9:1
    • 按照这个设计,我们将每个阶段的块数从 ResNet-50 的 ( 3 , 4 , 6 , 3 ) (3, 4, 6, 3) (3,4,6,3) 调整为 ( 3 , 3 , 9 , 3 ) (3, 3, 9, 3) (3,3,9,3),这也使得 FLOPs 与 Swin-T 对齐。这使得模型准确率从 78.8% 提升到 79.4%。
    • 值得注意的是,研究人员已经彻底研究了计算分布,可能存在更优的设计。
    • 从现在开始,我们将使用这个阶段计算比例。
  • 将“干细胞”更改为“切块”(Changing stem to “Patchify”)
    • 通常,干细胞(stem cell)设计关注的是网络开始时如何处理输入图像。由于自然图像固有的冗余,常见的干细胞会在标准 ConvNets 和视觉 Transformers 中积极地将输入图像下采样到适当的大小。
      • 标准 ResNet 中的干细胞包含一个 7 × 7 7\times7 7×7、步长为 2 2 2 的卷积层,后面跟着一个最大池化层,这导致输入图像的 4 4 4 倍下采样。
      • 在视觉 Transformers 中,作为干细胞的“切块”策略更为激进,这相当于一个大的内核尺寸(例如,内核尺寸 = 14 =14 =14 16 16 16)和非重叠卷积。Swin Transformer 使用了类似的“切块”层,但具有较小的块尺寸 4 4 4 以适应架构的多阶段设计。
    • 我们用 4 × 4 4\times4 4×4、步长 4 4 4 的卷积层实现的“切块”层替换了 ResNet 风格的干细胞。准确率从 79.4% 变为 79.5%。这表明 ResNet 中的干细胞可以替换为类似 ViT 的更简单的“切块”层,这将导致类似的性能。
    • 我们将在网络中使用“切块干细胞”( 4 × 4 4\times4 4×4 非重叠卷积)。

2.3 ResNeXt-ify

  • 在这一部分,我们尝试采用 ResNeXt 的思想,其 FLOPs / 准确性权衡比普通的 ResNet 更好。
    • 核心组件是分组卷积(grouped convolution),其中卷积滤波器被分离到不同的组中。
    • 从高层次来看,ResNeXt 的指导原则是“使用更多组,扩展宽度”。
    • 更精确地说,ResNeXt 在瓶颈块中的 3 × 3 3\times3 3×3 卷积层使用分组卷积。这显著降低了 FLOPs,因此网络宽度被扩展以补偿容量损失。
  • 深度卷积(Depthwise conv)
    • 在我们的案例中,我们使用深度卷积,这是分组卷积的一种特殊情况,其中组数等于通道数。深度卷积由 MobileNet 和 Xception 普及。
    • 我们注意到,深度卷积与自注意力中的加权求和操作相似,后者基于通道进行操作,即只在空间维度上混合信息。
    • 深度卷积和 1 × 1 1\times1 1×1 卷积的组合导致空间和通道混合的分离,这是视觉 Transformers 共享的属性,其中每个操作要么在空间维度上混合信息,要么在通道维度上混合信息,但不会同时混合两个维度。
    • 深度卷积的使用有效地减少了网络的 FLOPs,并且如预期那样,也降低了准确性。遵循 ResNeXt 提出的策略,我们将网络宽度增加到与 Swin-T 相同数量的通道(从 64 增加到 96)。这使得网络性能达到了 80.5%,同时增加了 FLOPs(5.3G)。
  • 我们将现在采用 ResNeXt 设计。

2.4.Inverted Bottleneck

倒置 Bottleneck

接下来,我们将采用倒置瓶颈设计。

  • 每个 Transformer 模块的一个重要设计是它创建了一个倒置的瓶颈,即 MLP 模块的隐藏维度是输入维度的四倍宽(见图 4)。有趣的是,这种 Transformer 设计与其在 ConvNets 中使用的具有 4 倍扩展比的倒置瓶颈设计有关。这个想法是由 MobileNetV2 普及的,随后在几种先进的 ConvNet 架构中得到了应用。

    在这里插入图片描述

    • 图片注解:图 4 展示了ResNet、Swin Transformer和ConvNeXt的模块设计。Swin Transformer 的模块更为复杂,因为存在多个专门的模块和两个残差连接。为了简化,我们注意到 Transformer MLP 模块中的线性层也称为“ 1×1 卷积”,因为它们等效于 1×1 卷积。
  • 在这里,我们探索倒置瓶颈设计。图 3(a)到(b)展示了配置。尽管深度卷积层的 FLOPs 有所增加,但这一变化通过在降采样残差块的快捷路径 1 × 1 1\times1 1×1 卷积层中显著减少 FLOPs,将整个网络的 FLOPs 减少到 4.6G。有趣的是,这略微提高了性能(从 80.5% 到 80.6%)。在 ResNet-200 / Swin-B 范围内,这一步骤带来了更多的收益(从 81.9% 到 82.6%),同时减少了 FLOPs。

    在这里插入图片描述

    • 图片注解:图 3 展示了模块修改和结果规格。图 (a) 是一个ResNeXt模块;图 (b) 中我们创建了一个倒置瓶颈模块;图 © 中,空间深度卷积层的放置位置被移到了上方。
  • 我们将现在使用倒置瓶颈。

2.5.Large Kernel Sizes

大尺寸内核

  • 在这一部分的探索中,我们关注大卷积核的行为。视觉 Transformer 最显著的特点之一是它们的自注意力,这使得每一层都有一个全局的感受野。
    • 虽然在过去 ConvNets 中曾使用过大内核尺寸,但黄金标准(由 VGGNet 普及)是堆叠小内核尺寸(3×3)的卷积层,这些层在现代 GPU 上有高效的硬件实现。
    • 尽管 Swin Transformer 将局部窗口重新引入到自注意力块中,但窗口大小至少为 7×7,明显大于 ResNe(X)t 内核尺寸的 3×3。
    • 在这里,我们重新审视在 ConvNets 中使用大内核尺寸卷积的使用。
  • 移动深度卷积层(Moving up depthwise conv layer)
    • 为了探索大内核,一个前提是将深度卷积层的位置上移(图3 (b)到©)。这也是在 Transformer 中明显的设计决策:MSA 块位于 MLP 层之前。
    • 由于我们有一个倒置瓶颈模块,这是自然的设计选择——复杂的/低效的模块(MSA,大内核卷积)将具有较少的通道,而高效的、密集的 1×1 层将执行大部分工作。这一中间步骤将FLOPs减少到 4.1G,导致临时性能下降到 79.9%。
  • 增加内核尺寸(Increasing the kernel size)
    • 在这些准备工作的基础上,采用更大内核尺寸卷积的好处是显著的。
    • 我们实验了几个内核尺寸,包括 3、5、7、9 和 11。网络的性能从 79.9%(3×3)增加到 80.6%(7×7),而网络的 FLOPs大致保持不变。
    • 此外,我们观察到,更大内核尺寸的好处在 7×7 时达到饱和点。我们在大容量模型中也验证了这一行为:当内核尺寸超过 7×7 时,ResNet-200 范围的模型没有进一步的收益。
  • 我们将每个块中使用 7×7 深度卷积。
  • 到目前为止,我们已经完成了对网络架构在宏观层面的检查。有趣的是,在视觉 Transformer 中做出的许多设计选择可以映射到 ConvNet 实例中。

2.6.Micro Design

微观设计

在这一节中,我们调查了其他一些在微观层面的架构差异——这里的许多探索都是在层级别进行的,重点关注特定的激活函数和标准化层的选择。

  • 用 GELU 替换 ReLU(Replacing ReLU with GELU)

    • 在计算机视觉和自然语言处理架构之间的一个差异是使用哪些激活函数的具体细节。
    • 随着时间的推移,已经开发了许多激活函数,
      • 但修正线性单元(Rectified Linear Unit,ReLU)由于其简单性和效率,仍然在 ConvNets 中广泛使用。ReLU 也是原始 Transformer 论文中使用的激活函数。
      • 高斯误差线性单元(Gaussian Error Linear Unit,GELU),可以被视为 ReLU 的平滑变体,在包括谷歌的 BERT 和 OpenAI 的 GPT-2 在内的最先进的 Transformer 中使用,并且最近在 ViTs 中使用。
    • 我们发现,在我们的 ConvNet中,ReLU 也可以用 GELU 替换,尽管准确率保持不变(80.6%)。
  • 更少的激活函数(Fewer activation functions)

    • Transformer 和 ResNet 块之间的一个较小区别是,Transformer 中的激活函数较少。
      • 考虑一个带有键/查询/值线性嵌入层、投影层和 MLP 块中的两个线性层。在 MLP 块中只有一个激活函数。
      • 相比之下,通常的做法是在每个卷积层(包括 1×1 卷积层)后附加一个激活函数。
    • 在这里,我们检查当我们坚持相同的策略时,性能如何变化。
      • 如图 4 所示,我们在残差块中除了两个 1×1 层之间的一个 GELU 层之外,移除了所有 GELU 层,复制了 Transformer 块的风格。
      • 这个过程将结果提高了 0.7%,达到了 81.3%,实际上匹配了 Swin-T 的性能。我们将现在在每个块中使用一个 GELU 激活。
  • 更少的标准化层(Fewer normalization layers)

    • Transformer 模块通常也有较少的标准化层。
    • 在这里,我们移除了两个 BatchNorm(BN)层,只留下一个 BN 层在卷积 1×1 层之前。这进一步提高了性能,达到了81.4%,已经超过了 Swin-T 的结果。
    • 注意,我们每个块中的标准化层比 Transformer 还要少,因为经验上我们发现,在块的开始处添加一个额外的BN层并不会改善性能。
  • 用 LN 替换 BN(Substituting BN with LN)

    • 批量归一化(BatchNorm)是 ConvNets 中的一个重要组件,因为它改善了收敛性和减少了过拟合。
      • 然而,BN 也有很多复杂性,可能会对模型的性能产生有害影响。已经有很多尝试开发替代的标准化技术,但 BN 在大多数视觉任务中仍然是首选选项。
    • 另一方面,更简单的层归一化(Layer Normalization)(LN)已经被用在 Transformer 中,在不同应用场景中都取得了良好的性能。
      • 直接用 LN 替换原始 ResNet 中的 BN 会导致性能不佳。
      • 在所有网络架构和训练技术的修改之后,我们重新审视了使用 LN 代替 BN 的影响。
        • 我们观察到,我们的 ConvNet 模型使用 LN 进行训练没有任何困难;
        • 实际上,性能略有提升,获得了 81.5% 的准确率。从现在开始,我们将使用一个 LayerNorm 作为每个残差块中的标准化选择。
  • 分离下采样层(Separate downsampling layers)

    • 在 ResNet 中,空间下采样是通过每个阶段的残差块实现的,使用步长为 2 的 3×3 卷积(以及在快捷路径中的步长为 2 的 1×1 卷积)。在 Swin Transformers 中,在阶段之间添加了一个独立的下采样层。
    • 我们探索了一种类似的策略,其中我们使用步长为 2 的 2×2 卷积进行空间下采样。这个修改令人惊讶地导致了训练发散。
    • 进一步的调查表明,在空间分辨率改变的地方添加标准化层可以帮助稳定训练。这些包括在 Swin Transformers 中使用的一些 LN 层:每个下采样层之前一个,在干细胞之后一个,以及在最后的全局平均池化之后一个。
    • 我们可以将准确率提高到 82.0%,显著超过 Swin-T 的 81.3%。我们将使用分离的下采样层。
  • 这带我们到了我们的最终模型,我们称之为 ConvNeXt。
    可以在图 4 中找到 ResNet、Swin 和 ConvNeXt 块结构的比较。可以在表 9 中找到 ResNet-50、Swin-T 和 ConvNeXt-T 的详细架构规格的比较。

    在这里插入图片描述

    • 图片注解:表9展示了 ResNet-50、ConvNeXt-T和Swin-T的详细架构规格。

Section 3 Empirical Evaluations on ImageNet

我们构建了不同的 ConvNeXt 变体,

  • ConvNeXt-T/S/B/L,以与 Swin-T/S/B/L 具有相似的复杂性。

  • ConvNeXt-T/B 分别是基于 ResNet-50/200 规则的“现代化”过程的最终产品。

  • 此外,我们构建了一个更大的 ConvNeXt-XL,以进一步测试 ConvNeXt 的可扩展性。

    • 这些变体只在通道数 C 和每个阶段的块数 B 上有所不同。
  • 遵循 ResNets 和 Swin Transformers 的做法,每个新的阶段通道数翻倍。我们总结配置如下:

    • ConvNeXt-T: C = (96, 192, 384, 768), B = (3, 3, 9, 3)
    • ConvNeXt-S: C = (96, 192, 384, 768), B = (3, 3, 27, 3)
    • ConvNeXt-B: C = (128, 256, 512, 1024), B = (3, 3, 27, 3)
    • ConvNeXt-L: C = (192, 384, 768, 1536), B = (3, 3, 27, 3)
    • ConvNeXt-XL: C = (256, 512, 1024, 2048), B = (3, 3, 27, 3)

3.1.Settings

  • 数据集

    • ImageNet-1K 数据集包含 1000 个对象类,有 120 万张训练图像。我们报告了验证集上的 ImageNet-1K top-1 准确率。
    • 我们还进行了在 ImageNet-22K 上的预训练,这是一个包含 21841 个类(是 1000 个 ImageNet-1K 类的超集)的大数据集,有约 1400 万张图像用于预训练,然后在 ImageNet-1K 上微调预训练模型进行评估。
    • 我们总结我们的训练设置如下。更多细节可以在附录A中找到。
  • 在ImageNet-1K上训练(Training on ImageNet-1K)

    • 我们使用 AdamW 优化器训练 ConvNeXts 300 个周期,学习率为 4e-3。
    • 有一个 20 个周期的线性热身(linear warmup)和随后的余弦衰减计划。
    • 我们使用 4096 的批量大小和 0.05的权重衰减。
    • 对于数据增强,我们采用包括 Mixup、Cutmix、RandAugment 和 Random Erasing 在内的常见方案。
    • 我们使用 Stochastic Depth 和 Label Smoothing 来正则化网络。
    • 应用了初始值为 1e-6 的 Layer Scale。
    • 我们使用指数移动平均(EMA),因为我们发现它减轻了更大模型的过拟合。
  • 在ImageNet-22K上预训练(Pre-training on ImageNet-22K)

    我们在 ImageNet-22K 上预训练 ConvNeXts 90 个周期,热身 5 个周期。我们不使用 EMA。其他设置遵循 ImageNet-1K。

  • 在ImageNet-1K上微调(Fine-tuning on ImageNet-1K)

    • 我们在 ImageNet-22K 预训练的模型上进行 30 个周期的 ImageNet-1K 微调。
    • 我们使用 AdamW 优化器,学习率为 5e-5,余弦学习率计划,层间学习率衰减,没有热身周期,批量大小为 512,权重衰减为 1e-8。
    • 默认的预训练、微调和测试分辨率是 22 4 2 224^2 2242。此外,我们还在较大的分辨率 38 4 2 384^2 3842 上对 ImageNet-22K 和 ImageNet-1K 预训练模型进行微调。

与 ViTs/Swin Transformers 相比,ConvNeXts 在不同分辨率下进行微调更为简单,因为网络是全卷积的,不需要调整输入块大小或插值绝对/相对位置偏置。

3.2.Results

  • ImageNet-1K

    • 表1(上部)显示了与最近两种 Transformer 变体 DeiT 和 Swin Transformers 以及两种来自架构搜索的 ConvNets——RegNets、EfficientNets 和 EfficientNetsV2 的结果比较。

      在这里插入图片描述

      • 图片注解:表1. ImageNet-1K 上的分类准确率。与 Transformers 类似,ConvNeXt 也显示出随着更高容量模型和更大规模(预训练)数据集的 promising 缩放行为。推理吞吐量是在 V100 GPU 上测量的,遵循[45]。在 A100 GPU 上,ConvNeXt 的吞吐量可以远高于 Swin Transformer。见附录E。通过与作者的私人沟通提供的 (T)ViT 结果,采用90周期的 AugReg [67] 训练。
    • ConvNeXt 在与两个强大的 ConvNet 基线(RegNet 和 EfficientNet)的准确性-计算量权衡方面以及在推理吞吐量方面竞争激烈。

    • ConvNeXt 还在与类似复杂度的 Swin Transformer 的比较中取得了全面的优势,有时甚至有显著的差距(例如,对于 ConvNeXt-T 为 0.8%)。

    • 由于没有专用模块,如移位窗口或相对位置偏置,ConvNeXts 在与 Swin Transformers 的比较中还享受了改进的吞吐量。

    • 从结果中值得注意的是,在 38 4 2 384^2 3842 分辨率下的 ConvNeXt-B:它的准确率比 Swin-B 高 0.6%(85.1% 对比 84.5%),但推理吞吐量提高了 12.5%(95.7 对比 85.1 图像/秒)。

    • 我们注意到,当分辨率从 22 4 2 224^2 2242 增加到 38 4 2 384^2 3842 时,ConvNeXt-B 相对于 Swin-B 的 FLOPs/吞吐量优势变得更大。此外,当我们进一步扩展到 ConvNeXt-L 时,结果有所改善,达到了 85.5%

  • ImageNet-22K

    我们在表1(下部)展示了从ImageNet-22K预训练中得到的模型的结果。

    在这里插入图片描述

    • 这些实验很重要,因为一个普遍的观点是,视觉 Transformers 具有较少的归纳偏置,因此在大规模预训练下,其性能可以优于 ConvNets。
    • 我们的结果表明,当在大数据集上预训练时,设计得当的 ConvNets 并不逊色于视觉 Transformers——ConvNeXts 的性能仍然与同样大小的 Swin Transformers 相当或更好,吞吐量略高。
    • 此外,我们的 ConvNeXt-XL 模型在 38 4 2 384^2 3842 分辨率下实现了 87.8% 的准确率,这是对 ConvNeXt-L 的一个相当不错的改进,表明 ConvNeXts 是可扩展的架构。
    • 在 ImageNet-1K 上,EfficientNetV2-L,一个配备了先进模块(如 Squeeze-and-Excitation)和渐进式训练过程的搜索架构,实现了最佳性能。然而,随着 ImageNet-22K 的预训练,ConvNeXt 能够超越 EfficientNetV2,进一步证明了大规模训练的重要性。
    • 在附录B中,我们讨论了 ConvNeXt 的稳健性和跨域泛化结果。

3.3.Isotropic ConvNeXt vs. ViT

各向同性 ConvNeXt 对比 ViT

  • 在这项消融研究中,我们检查了我们的 ConvNeXt 块设计是否适用于 ViT 风格的各向同性架构,这些架构没有下采样层,并且在所有深度上保持相同的特征分辨率(例如 14×14)。

    • 我们使用与 ViT-S/B/L 相同的特征维度构建各向同性 ConvNeXt-S/B/L(分别为 384/768/1024)。
    • 深度设置为 18/18/36,以匹配参数数量和 FLOPs。块结构保持不变(图4)。
    • 我们使用 DeiT 的监督训练结果作为 ViT-S/B 的训练数据,以及 MAE 作为 ViT-L 的训练数据,因为它们采用了比原始 ViTs 更改进的训练程序。
    • ConvNeXt 模型使用与之前相同的设置进行训练,但热身周期更长。
  • ImageNet-1K 在 22 4 2 224^2 2242 分辨率下的结果见表2。我们观察到 ConvNeXt 通常与 ViT 相当,表明我们的 ConvNeXt 块设计在与非分层模型一起使用时具有竞争力。

    在这里插入图片描述

    • 图片注解:各向同性 ConvNeXt 与 ViT 的比较。训练内存在 V100 GPU 上测量,每个 GPU 的批次大小为 32。

Section 4 Empirical Evaluation on Downstream Tasks

下游任务的实证评估

  • 在 COCO上 的目标检测和分割

    • 我们在 COCO 数据集上使用 ConvNeXt 作为骨干网络对 Mask R-CNN 和 Cascade Mask R-CNN 进行微调。遵循 Swin Transformer,我们使用多尺度训练、AdamW 优化器,以及 3× 的训练计划。更多的细节和超参数设置可以在附录 A.3 中找到。

    • 表3展示了在 Swin Transformer、ConvNeXt 和传统的 ConvNet(如 ResNeXt)之间的目标检测和实例分割结果比较。

      在这里插入图片描述

      • 图片注解:表3. 使用 Mask-RCNN 和 Cascade Mask-RCNN 的 COCO 目标检测和分割结果。‡ 表示模型在 ImageNet-22K 上预训练。ImageNet-1K 预训练的 Swin 结果来自他们的 Github 仓库。ResNet-50 和 X101 模型的 AP 数字来自[45]。我们在 A100 GPU 上测量了 FPS。FLOPs 是在图像大小(1280, 800)下计算的。
    • 在不同的模型复杂性下,ConvNeXt 实现了与 Swin Transformer 相当或更好的性能。

    • 当将模型规模扩大到在 ImageNet-22K 上预训练的更大模型(ConvNeXt-B/L/XL)时,在许多情况下,ConvNeXt 在框和掩码 AP 方面明显优于 Swin Transformers(例如+1.0 AP)。

  • 在ADE20K语义分割任务上的评估

    • 我们还使用 UperNet 在 ADE20K 语义分割任务上评估了 ConvNeXt 骨干网络。

    • 所有模型变体都使用 16 个批量大小的批量大小训练了 160K 次迭代。其他实验设置遵循[6](更多细节请参阅附录A.3)。

    • 在表 4 中,我们报告了多尺度测试的验证 mIoU。ConvNeXt 模型可以在不同的模型容量下实现有竞争力的性能,进一步验证了我们架构设计的有效性。

      在这里插入图片描述

      • 图片注解:表4. 使用 UperNet 的 ADE20K 验证结果。‡ 表示在 IN-22K 上预训练。Swin 的结果来自其 GitHub 仓库。遵循 Swin,我们报告了多尺度测试的 mIoU 结果。FLOPs 基于 IN-1K 和 IN-22K 预训练模型的输入大小(分别为(2048, 512)和(2560, 640))。
  • 关于模型效率的评论

    • 在类似的 FLOPs 下,已知使用深度卷积的模型比仅使用密集卷积的 ConvNets 慢,并且消耗更多内存。自然会有人问,ConvNeXt 的设计是否会使其在实际中变得低效。如本文所示,ConvNeXt 的推理吞吐量与或超过 Swin Transformers。这适用于分类以及需要更高分辨率输入的其他任务(请参阅表1、3中的吞吐量/FPS比较)。
    • 此外,我们注意到训练 ConvNeXt 所需的内存比训练 Swin Transformers 少。
      • 例如,使用 ConvNeXt-B 骨干网络训练 Cascade Mask-RCNN 消耗了 17.4GB 峰值内存,每个 GPU 的批量大小为 2,而 Swin-B 的参考数字是 18.5GB。
      • 与普通的 ViT 相比,ConvNeXt 和 Swin Transformer 都展示出更优的准确性-FLOPs 权衡,这归功于局部计算。
      • 值得注意的是,这种改进的效率是 ConvNet 归纳偏置的结果,与视觉 Transformers 中的自注意力机制直接相关。

Section 5 Related Work

  • 混合模型(Hybrid models)

    在 ViT 之前和之后的时代,结合卷积和自注意力的混合模型一直受到积极研究。在 ViT 之前,重点是增强一个 ConvNet,以包含自注意力/非局部模块,以捕获长程依赖关系。原始的 ViT 首先研究了一种混合配置,大量的后续工作集中在向 ViT 中重新引入卷积先验,无论是以显式还是隐式的方式。

  • 最近的基于卷积的方法(Recent convolution-based approaches)

    • Han 等人表明,局部 Transformer 注意力等价于非均质的动态深度卷积。然后,Swin 中的 MSA 块被动态或常规深度卷积所替代,实现了与 Swin 相当的性能。
    • 一篇同时的工作 ConvMixer 表明,在小规模设置中,深度卷积可以作为一种有前途的混合策略。ConvMixer 使用较小的块尺寸来达到最佳结果,使得吞吐量远低于其他基线。
    • GFNet 采用快速傅里叶变换(FFT)进行标记混合。FFT 也是一种卷积形式,但具有全局内核尺寸和循环填充。
    • 与许多最近的 Transformer 或 ConvNet 设计不同,我们研究的主要目标之一是深入研究将标准 ResNet 现代化的过程,并实现最先进的性能。

附录

A. Experimental Settings

A.1. ImageNet (Pre-)training
  • 我们在表 5 中提供了 ConvNeXts 的 ImageNet-1K 训练和 ImageNet-22K 预训练设置。这些设置用于我们在第3.2节表 1 中的主要结果。所有 ConvNeXt 变体使用相同的设置,除了随机深度率是根据模型变体自定义的。

    在这里插入图片描述

    • 图片注解:表 5. ImageNet-1K/22K (预-)训练设置。多个随机深度率(例如,0.1/0.4/0.5/0.5)分别为每个模型(例如,ConvNeXt-T/S/B/L)分别设置。
  • 在 “现代化一个 ConvNet” 的实验(第2节)中,我们也使用表 5 中的 ImageNet-1K 设置,除了禁用了 EMA,因为我们发现使用 EMA 严重损害了带有 BatchNorm 层的模型。

  • 对于各向同性的 ConvNeXts(第3.3节),也采用了表 A 中 ImageNet-1K 的设置,但热身期扩展到 50 个周期,并且对于各向同性 ConvNeXt-S/B 禁用了层尺度。各向同性 ConvNeXt-S/B/L 的随机深度率分别为0.1/0.2/0.5。

A.2. ImageNet Fine-tuning
  • 我们在表 6 中列出了在 ImageNet-1K 上微调的设置。

    在这里插入图片描述

    • 图片注解:表6. ImageNet-1K 微调设置。多个值(例如,0.8/0.95)分别为每个模型(例如,ConvNeXt-B/L)分别设置。
  • 微调从预训练中获得的最终模型权重开始,即使预训练中使用了 EMA 权重并且报告了 EMA 的准确率,我们也不使用 EMA 权重进行微调(这与[73]中的观察结果一致)。这是因为我们没有观察到使用 EMA 权重进行微调时的改进。唯一的例外是ImageNet-1K上预训练的ConvNeXt-L,由于过拟合,其模型准确率明显低于 EMA 准确率,我们选择预训练期间最佳 EMA 模型作为微调的起点。

  • 在微调过程中,我们使用层间学习率衰减,每 3 个连续块形成一个组。当模型在 38 4 2 384^2 3842 分辨率下进行微调时,我们使用 1.0 的裁剪比例(即,测试时不裁剪),而不是 22 4 2 224^2 2242 分辨率下的 0.875。

A.3. Downstream Tasks

下游任务

  • 对于 ADE20K 和 COCO 实验,我们遵循 BEiT 和 Swin 中使用的训练设置。我们还使用 MMDetection 和 MMSegmentation 工具箱。我们使用 ImageNet 预训练的最终模型权重(而不是 EMA 权重)作为网络初始化。

  • 对于 COCO 实验,我们进行了一次轻量级的调整,包括学习率{1e-4, 2e-4},层间学习率衰减 {0.7, 0.8, 0.9, 0.95},以及随机深度率{0.3, 0.4, 0.5, 0.6, 0.7, 0.8}。我们使用相同的调整对 ImageNet-22K 预训练的 Swin-B/L 进行 COCO 微调。我们使用官方代码和预训练模型权重。

  • 我们在 ADE20K 实验中遍历的超参数包括学习率{8e-5, 1e-4},层间学习率衰减{0.8, 0.9},以及随机深度率{0.3, 0.4, 0.5}。我们使用多尺度测试报告了验证 mIoU 结果。额外的单尺度测试结果在表7中。

    在这里插入图片描述

    • 图片注解:表 7. ADE20K 单比例测试的验证结果。

B. Robustness Evaluation

稳健性评估

  • 表 8 展示了 ConvNeXt 模型的额外稳健性评估结果。我们直接测试了在 ImageNet-1K 上训练/微调的分类模型在几个稳健性基准数据集上,如 ImageNet-A 、ImageNet-R、ImageNet-Sketch 和 ImageNetC/ ̄ C 数据集。我们报告了 ImageNet-C 的平均损坏错误(mCE)、ImageNet- ̄ C 的损坏错误,以及所有其他数据集的 top-1 准确率。

    在这里插入图片描述

    • 图片注解:表 8. ConvNeXt 的鲁棒性评估。我们没有使用任何专门模块或额外的微调程序。
  • ConvNeXt(特别是大规模模型变体)表现出有前景的稳健性行为,在几个基准测试中超过了最先进的稳健 Transformer 模型。通过额外的 ImageNet-22K 数据,ConvNeXtXL 展示了强大的域泛化能力(例如,在 ImageNetA/R/Sketch 基准测试上分别达到 69.3%/68.2%/55.0% 的准确率)。我们注意到,这些稳健性评估结果是在没有使用任何专用模块或额外的微调程序的情况下获得的。

C. Modernizing ResNets: detailed results

ResNets 现代化:详细成果

  • 在这里,我们为现代化实验提供了详细的表格结果,包括 ResNet-50 / Swin-T 和 ResNet-200 / Swin-B 两个规则。每个步骤的 ImageNet-1K top-1 准确率和 FLOPs 在表 10 和 11 中显示。ResNet-50 规则下的实验使用了 3 个随机种子。

    在这里插入图片描述

    • 图片注解:表 10. ResNet-50 现代化的详细结果。平均值和标准偏差是通过使用三种不同的随机种子对网络进行训练得出的。

    在这里插入图片描述

    • 图片注解:表 11. ResNet-200 现代化的详细结果。
  • 对于ResNet-200,每个阶段的初始块数是(3, 24, 36, 3)。在改变阶段比例的步骤中,我们将它改为 Swin-B 的(3, 3, 27, 3),这极大地减少了 FLOPs,因此在同一时间,我们将宽度从 64 增加到 84,以保持 FLOPs 在相似的水平。在采用深度卷积的步骤之后,我们进一步将宽度增加到 128(与 Swin-B 相同),作为单独的步骤。

  • 在 ResNet-200 规则下的观察结果与论文中描述的 ResNet-50 规则 mostly 一致。一个有趣的差异是,在 ResNet-50 规则下,反转维度带来的改进比在 ResNet-200 规则下更大(+0.79% 对比 +0.14%)。增加内核尺寸获得的性能似乎在内核大小为 5 时饱和,而不是 7。使用更少的标准化层相比ResNet-50规则也有更大的收益(+0.46%对比+0.14%)。

D. Detailed Architectures

详细架构

我们在表 9 中详细展示了 ResNet-50、ConvNeXt-T 和 Swin-T 之间的架构比较。对于不同大小的 ConvNeXts,只有每个阶段的块数和通道数与 ConvNeXt-T 不同(详见第3节)。ConvNeXts 享受标准 ConvNets的简单性,但在视觉识别方面与 Swin Transformers竞争。

在这里插入图片描述

  • 图片注解:表 9. ResNet-50、ConvNeXt-T 和 Swin-T 的详细架构规格。

E. Benchmarking on A100 GPUs

A100 GPU 基准测试

遵循 Swin Transformer,表 1 中 ImageNet 模型的推理吞吐量在 V100 GPU 上进行了基准测试,其中 ConvNeXt 在参数量相似的情况下比 Swin Transformer 稍快。现在我们在更先进的 A100 GPU 上进行基准测试,这些 GPU 支持 TensorFloat32 (TF32) 张量核心。我们使用 PyTorch 版本 1.10 来使用最新的 “Channel Last” 内存布局,以进一步加速。

我们将在表 12 中展示结果。Swin Transformer 和 ConvNeXt 都实现了比 V100 GPU 更快的推理吞吐量,但 ConvNeXt 的优势现在明显更大,有时甚至快 49%。这项初步研究表明,ConvNeXt,采用标准的 ConvNet 模块和简单的设计,在现代硬件上可能是更实用的更高效模型。

在这里插入图片描述

  • 图片注解:表 12. 在 A100 GPU 上的推理吞吐量比较。使用 TF32 数据格式和 "通道最后 "内存布局,ConvNeXt 的吞吐量比具有类似 FLOPs 的 Swin Transformer 高出 49%。

F. Limitations

局限性

  • 我们展示了 ConvNeXt,一个纯卷积神经网络模型,在图像分类、目标检测、实例和语义分割任务上能够与分层视觉 Transformer 表现相当。
  • 虽然我们的目标是提供一个广泛的评估任务范围,但我们认识到计算机视觉应用甚至更加多样化。ConvNeXt 可能更适合某些任务,而 Transformer 在其他任务上可能更加灵活。
    • 例如,在多模态学习中,跨注意力模块可能更适用于建模许多模态之间的特征交互。
    • 此外,当用于需要离散化、稀疏或结构化输出的任务时,Transformer可能更加灵活。我们相信,架构选择应该满足当前任务的需求,同时力求简单。

G. Societal Impact

社会影响

  • 在2020年代,对视觉表示学习的研究开始对计算资源提出巨大的需求。

    • 虽然更大的模型和数据集可以全面提升性能,但它们也带来了一系列挑战。ViT、Swin 和 ConvNeXt 都在其巨大的模型变体上表现最佳。研究这些模型设计不可避免地导致碳排放量的增加。
    • 我们论文的一个重要方向,也是我们的动机,是追求简单性——随着更复杂的模块,网络的设计空间急剧扩大,掩盖了对性能差异做出关键贡献的组件。
    • 此外,大型模型和数据集在模型稳健性和公平性方面也存在问题。进一步研究 ConvNeXt 与 Transformer 的稳健性行为将是一个有趣的研究方向。
  • 在数据方面,我们的发现表明,ConvNeXt 模型受益于在大规模数据集上的预训练。虽然我们的方法利用了公开可用的 ImageNet-22K 数据集,但个人可能希望获取自己的数据进行预训练。需要更加审慎和负责的数据选择方法,以避免数据偏见等潜在问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯2022年第十三届省赛真题-数的拆分

solution1&#xff08;通过10%&#xff09; #include<stdio.h> #include<math.h> typedef long long LL; int isPrime(LL n){LL sqr (int)sqrt(1.0 * n);for(int i 2; i < sqr; i){if(n % i 0) return 0;}return 1; } int main(){int t;LL a;scanf("%d…

IntelliJ IDEA 2023.3.4创建JavaWeb应用和集成Tomcat服务器

1. 创建项目 如下图所示&#xff0c;只需要给项目起一个项目名称&#xff0c;然后点击Create即可&#xff1a; 2. Project Structure 设置 创建完成后如下图 3. 集成Tomcat服务器 4. 实现Servlet接口 当我们实现Servlet接口时&#xff0c;发现没有Servlet相关的依赖时&am…

数学建模-估计出租车的总数

文章目录 1、随机抽取的号码在总体的排序 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,…,x10​ 总体的一个样…

深入浅出Hive性能优化策略

我们将从基础的HiveQL优化讲起&#xff0c;涵盖数据存储格式选择、数据模型设计、查询执行计划优化等多个方面。会的直接滑到最后看代码和语法。 目录 引言 Hive架构概览 示例1&#xff1a;创建表并加载数据 示例2&#xff1a;优化查询 Hive查询优化 1. 选择适当的文件格…

考研数二要掌握的高中知识点(四)

文章目录 一、正切函数的图像性质二、三角函数恒等变换公式1. 同角齐次式2. 两角和与差公式3. 辅助角公式4. 二倍角公式5. 降幂公式6. 半角公式&#xff08;二倍角公式的变形&#xff09;7. 万能公式 三、反三角函数1. 反正弦函数2. 反余弦函数3. 反正切函数 一、正切函数的图像…

保研|资讯|夏令营|3.31截止!香港城市大学市场营销学系首届学术暑期夏令营

香港城市大学市场营销学系首届学术暑期夏令营 1 项目简介 我们的博士项目致力为未来营销科学和工商管理学界培养一流学者和行业领袖。博士项目一般为期四到六年&#xff0c;允许本科生直接申请。课程包括实证分析模型&#xff0c;消费者行为研究&#xff0c;博弈微观模型&…

自定义方法SQL注入器-DefaultSqlInjector

/*** 自定义Sql注入* author zy*/ public class SqlInjector extends DefaultSqlInjector {Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {// 注意&#xff1a;此SQL注入器继承了DefaultSqlInjector(默认注入器…

【prometheus】k8s集群部署prometheus server(文末送书)

目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3测试环境 二、k8s集群中部署prometheus server 2.1创建sa账号和数据目录 2.2安装prometheus 2.2.1创建configmap存储卷存放prometheus配置信息 2.2.2 通过deployment部署prometheus 2.2.3prometheus pod创…

HBase在表操作--显示中文

启动HBase后&#xff0c;Master和RegionServer两个服务器&#xff0c;分别对应进程为HMaster和HRegionServe。&#xff08;可通过jps查看&#xff09; 1.进入表操作 hbase shell 2.查看当前库中存在的表 list 3.查看表中数据&#xff08;注&#xff1a;学习期间可用&#…

Python小白笔记

输入 # 一行输入多个数字&#xff0c;空格隔开&#xff0c;存入列表a中 a list(map(int, input().split())) print(a) >>>21 22 34 54 67 >>>[21, 22, 34, 54, 67] 输出 数据&#xff1a; print(%d%10.3f%(x,y)) y的精度为3&#xff0c;宽度为10 %0 …

【Java】十大排序

目录 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的序列&#xff0c;依次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历…

oracle 19c打补丁到19.14

oracle 19c打补丁到19.14 oracle 19.3打补丁到19.14 查看oracle的版本&#xff1a; SQL> column product format A30 SQL> column version format A15 SQL> column version_full format A20 SQL> column status format A15 SQL> select * from product_compo…

【对顶队列】【中位数贪心】【前缀和】100227. 拾起 K 个 1 需要的最少行动次数

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 对顶队列&#xff08;栈&#xff09; 分类讨论 LeetCode100227. 拾起 K 个 1 需要的最少行动次数 给你一个下标从 0 开始的二进制数组 nums&#xff0c;其长度为 n &#x…

【LabVIEW FPGA入门】浮点数类型支持

如今&#xff0c;使用浮点运算来设计嵌入式系统的需求变得越来越普遍。随着 FPGA 因其固有的大规模并行性而在浮点性能方面继续超越微处理器&#xff0c;这种情况正在加剧。线性代数和数字信号处理 (DSP) 等高级算法可以受益于浮点数据类型的高动态范围精度。LabVIEW FPGA 通过…

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…

视频基础知识(一) 视频编码 | H.26X 系列 | MPEG 系列 | H.265

文章目录 一、视频编码二、 H.26X 系列1、H.2612、H.2633、H.2643.1 I帧3.2 P帧3.3 B帧 4、H.265 三、 MPEG 系列1、MPEG-12、MPEG-23、MPEG-44、MPEG-7 &#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&…

【HTML】HTML表单8.2(表单标签2)

目录 接上期&#xff0c;大致实现效果 文章简要 注释&#xff1a;这一次介绍的很多效果需要后期与服务器配合&#xff0c;但我们这里先只介绍效果 ①提交按钮 ②获取验证码 ③上传文件 ④还原所有表单内容 ⑤下拉表单 ⑥文字域 接上期&#xff0c;大致实现效果 文章简要 注…

OpenCV-Java 开发简介

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇&#xff1a;如何将OpenCV Java 与Eclipse结合使用 警告&#xff1a; 本教程可能包含过时的信息。 …

伺服电机编码器的分辨率指得是什么?

伺服电机编码器的分辨率是伺服电机编码器的重要参数。 一般来说&#xff0c;具体的伺服电机编码器型号可以找到对应的分辨率值。 伺服电机编码器的分辨率和精度不同&#xff0c;但也有一定的关系。 伺服电机编码器的分辨率是多少&#xff1f; 1、伺服编码器&#xff08;同步伺…

【JS】html字符转义

需求 将html转为字符串将html字符串转义&#xff0c;比如<div>转为<div> 码 /*** html标签字符转义* param {Stirng} str 要转换的html字符* returns String 返回转义的html字符串*/ const elToStr str > str.replaceAll(<, <).replaceAll(>, >)…