RevCol:可逆的柱状神经网络

文章目录

  • 摘要
  • 1、简介
  • 2、方法
    • 2.1、Multi-LeVEl ReVERsible Unit
    • 2.2、可逆列架构
      • 2.2.1、MACRo设计
      • 2.2.2、MicRo 设计
    • 2.3、中间监督
  • 3、实验部分
    • 3.1、图像分类
    • 3.2、目标检测
    • 3.3、语义分割
    • 3.4、与SOTA基础模型的系统级比较
    • 3.5、更多分析实验
      • 3.5.1、可逆列架构的性能提升
      • 3.5.2、可逆网络与非可逆网络
      • 3.5.3、使用中间监督的性能提升
      • 3.5.4、GPU内存消耗与模型大小
      • 3.5.5、卷积中核大小的消融实验
  • 4、相关工作
    • 4.1、分离表示学习和部分-整体层次
    • 4.2、可逆网络
  • 5、结论
  • A、MICRO 设计细节
  • B、概括Transformer
    • B.1、视觉Transformer模型
    • B.2、语言模型
    • B.3 列数量的鲁棒性
  • C. 半标注私人收集的大型模型数据集
    • C.1 数据收集和伪标签系统
    • C.2 图像去重
  • D. 更多训练细节
    • D.1 中间监督设置
    • D.2 用于训练和预训练的超参数
  • D.3 用于微调的超参数
    • D.3.1、下游任务中的卷积核填充技巧
  • E、功能解耦的可视化

摘要

https://arxiv.org/pdf/2212.11696v3.pdf
我们提出了一种新的神经网络设计范式可逆列网络(RevCol)。RevCol的主体由多个子网副本组成,这些子网之间采用多级可逆连接。这样的架构方案赋予RevCol与传统网络非常不同的行为:在前向传播过程中,RevCol中的特征在经过每一列时逐渐解纠缠,保留了列的总信息,而不是像其他网络那样压缩或丢弃。我们的实验表明,cnn风格的RevCol模型可以在图像分类、目标检测和语义分割等多个计算机视觉任务上取得非常有竞争力的性能,特别是在大参数预算和大数据集的情况下。例如,经过ImageNet-22K预训练,RevColXL获得了88.2%的ImageNet-1K准确率。给出更多的预训练数据,我们最大的模型RevCol-H在ImageNet-1K上达到90.0%,在COCO检测最小集上达到63.8% APbox,在ADE20k分割上达到61.0% mIoU。据我们所知,这是纯(静态)CNN模型中最好的COCO检测和ADE20k分割结果。此外,作为一种通用的宏观架构方式,RevCol也可以引入到变压器或其他神经网络中,这被证明可以提高计算机视觉和NLP任务的性能。我们在https://github.com/megvii-research/RevCol上发布代码和模型。

1、简介

信息瓶颈原则(IB)(Tishby等人,2000年;Tishby和Zaslavsky,2015年)统治着深度学习世界。考虑图1(a)中的典型监督学习网络:靠近输入的层包含更多低级信息,而靠近输出的特征则富含语义含义。换句话说,与目标无关的信息在逐层传播过程中逐渐被压缩。尽管这种学习范式在许多实际应用中取得了巨大的成功,但从特征学习的角度来看,它可能不是最佳选择-如果学习到的特征被过度压缩,或者学习到的语义信息与目标任务无关,特别是如果源任务和目标任务之间存在显著的领域差距,那么下游任务可能会受到较差的性能(Zamir等人,2018年)。研究者们已经付出了巨大的努力来使学习到的特征更加普遍适用,例如通过自监督预训练(Oord等人,2018年;Devlin等人,2018年;He等人,2022年;Xie等人,2022年)或多任务学习(Ruder,2017年;Caruana,1997年;Sener和Koltun,2018年)。
在这里插入图片描述

在这篇论文中,我们主要关注一种替代方法:构建一个网络来学习解耦表示。与信息瓶颈学习不同,解耦特征学习(Desjardins等人,2012年;Bengio等人,2013年;Hinton,2021年)的目的不是提取最相关的信息,同时丢弃不太相关的信息;相反,它的目的是将任务相关概念或语义词分别嵌入到几个解耦的维度中。同时整个特征向量大致保持与输入相同的信息。这与生物细胞中的机制非常相似(Hinton,2021年;Lillicrap等人,2020年)-每个细胞共享整个基因组的相同副本,但具有不同的表达强度。因此,在计算机视觉任务中,学习解耦特征也是合理的:例如,在ImageNet预训练期间调整高级语义表示,同时其他特征维度中也应维护低级信息(例如边缘的位置),以备下游任务(如目标检测)的需求。

图1(b)概述了我们的主要思想:可逆列网络(RevCol),该思想深受GLOM(Hinton,2021)的启发。我们的网络由N个子网络(称为列)组成,每个列的结构相同(然而其权重不一定相同),每个列接收输入的副本并生成预测。因此,多级嵌入,即从低级到高度语义表示,都存储在每个列中。此外,引入可逆变换将多级特征从第i列传播到第(i+1)列而不损失信息。在传播过程中,由于复杂性和非线性增加,所有特征级别的质量有望逐渐提高。因此,最后一列(图1(b)中的Col N)预测输入的最终解耦表示。
在这里插入图片描述

在RevCol中,我们的一个关键贡献是设计相邻列之间的可逆变换。这个概念借鉴了可逆网络家族(Chang等人,2018年;Gomez等人,2017年;Jacobsen等人,2018年;Mangalam等人,2022年);然而,传统的可逆结构,如RevNets(Gomez等人,2017年)(图2(a))通常有两个缺点:第一,可逆块内的特征图被限制为具有相同的形状;第二,RevNets中的最后两个特征图由于可逆性质而必须同时包含低级和高级信息,这可能很难优化,这与IB原则相冲突。在本文中,我们通过引入一个新型可逆多级融合模块克服了这些缺点。详情请参见第2部分。

我们构建了一系列基于CNN的RevCol模型,并在不同的复杂度预算下对其进行评估,用于主流计算机视觉任务,如ImageNet分类、COCO目标检测和实例分割,以及ADE20K语义分割。我们的模型在性能上可与先进的CNN或视觉Transformer(如ConvNeXt(Liu等人,2022b)和Swin(Liu等人,2021))相媲美,甚至更胜一筹。例如,经过ImageNet-22K预训练后,我们的RevCol-XL模型在ImageNet-1K上实现了88.2%的准确率,而无需使用Transformer或大型卷积核(Ding等人,2022b;Liu等人,2022b;Han等人,2021)。更重要的是,我们发现RevCol可以很好地扩展到大型模型和大型数据集。给定一个更大的私有预训练数据集,我们的最大模型RevCol-H在ImageNet-1K分类上获得了90.0%的准确率,在COCO检测minival集上获得了63.8%的APbox,在ADE20K分割上获得了61.0%的mIoU。据我们所知,它是这些任务上最好的可逆模型,也是COCO和ADE20K上最好的纯CNN模型,这两个任务只涉及静态核而不涉及动态卷积(Dai等人,2017;Ma等人,2020)。在附录中,我们进一步证明RevCol可以与Transformers(Dosovitskiy等人,2020;Devlin等人,2018)一起使用,并在计算机视觉和NLP任务上获得改进的结果。最后,与RevNets(Gomez等人,2017)类似,RevCol也具有可逆性节省内存的优势,这对于大型模型的训练尤其重要。

与先前作品的关系。尽管我们关于特征解耦的初步想法来自GLOM(Hinton,2021),但在RevCol中有很多简化和修改。例如,GLOM建议使用对比辅助损失来避免特征崩溃。对比训练方法需要额外的正负样本对,这很复杂且不稳定。在RevCol中,列之间的可逆变换提供了信息无损传播的自然方式。至于其他多尺度网格状架构,如HRNets(Wang等人,2020)、DEQ模型(Bai等人,2020)和FPNs(Lin等人,2017;Tan等人,2020),这些模型的设计目的是融合多尺度特征而不是学习解耦表示;因此,一般来说,它们仍然遵循图1(a)的模式——既没有多个入口/出口也没有可逆结构。基于这些网格状网络拓扑,基于NAS的工作(Ding等人,2021;Wu等人,2021;Liu等人,2019;Ghiasi等人,2019)针对特定数据集搜索网络架构的优化拓扑。然而,RevCol架构并不仅限于特定任务或数据集。由于其可逆性质,我们的方法保持了无损信息传播,并且不仅有利于预训练,也有利于其他下游任务。最近,RevBiFPN(Chiley等人,2022)提出了FPN的可逆变体,该变体进一步用在了HRNet类似的架构中。尽管我们的RevCol与RevBiFPN有相似的多尺度可逆变换思想,但我们的工作是独立完成的,它源于特征解耦的不同动机,并且具有更简单的架构(例如无需可逆上采样塔)和更高的性能。我们在第3部分比较了这些模型中的一些。

2、方法

在本节中,我们介绍了Reversible Column Networks (RevCol)的设计细节。图1(b)展示了顶层架构。请注意,对于RevCol中的每个列,为了简单起见,我们直接重用现有的结构,例如ConvNeXt(Liu等人,2022b)。因此,在以下子部分中,我们主要关注如何建立列之间的可逆连接。此外,我们在每个列的顶部引入了一个即插即用的中间监督,这进一步提高了训练收敛速度和特征质量。

2.1、Multi-LeVEl ReVERsible Unit

在我们的网络中,可逆变换在不损失信息的情况下在特征解耦中起着关键作用。其见解来自Reversible Neural Networks (Dinh等人,2014;Chang等人,2018;Gomez等人,2017;Jacobsen等人,2018;Mangalam等人,2022)。其中,我们首先回顾一下最具代表性的作品RevNet(Gomez等人,2017)。如图2(a)所示,RevNet首先将输入x分成两组,$ x_{0} 和 和 x_{1}$ 。然后在后面的块中,例如块t,它采用两个前块的输出 x t − 1 x_{t-1} xt1 x t − 2 x_{t-2} xt2 作为输入并生成输出x t 。块t的映射是可逆的,即x t-2 可以由两个后块 x t − 1 x_{t-1} xt1 x t x_{t} xt 重建。正式地,前向和反向计算遵循方程:
 Forward :  x t = F t ( x t − 1 ) + γ x t − 2  Inverse  : x t − 2 = γ − 1 [ x t − F t ( x t − 1 ) ] , (1) \begin{array}{l} \text { Forward : } x_{t}=\boldsymbol{F}_{t}\left(x_{t-1}\right)+\gamma x_{t-2} \\ \text { Inverse }: x_{t-2}=\gamma^{-1}\left[x_{t}-\boldsymbol{F}_{t}\left(x_{t-1}\right)\right], \end{array} \tag{1}  Forward : xt=Ft(xt1)+γxt2 Inverse :xt2=γ1[xtFt(xt1)],(1)
其中 F t \boldsymbol{F}_{t} Ft表示类似于标准ResNets中残差函数的任意非线性运算;\gamma是一个简单的可逆操作(例如,channel-wise缩放),其逆表示为 γ − 1 \gamma^{-1} γ1。如引言所述,上述公式对特征维度的约束太强,即 x t 、 x t + 2 、 x t + 4 、 x t + 4 x_{t}、x_{t+2}、x_{t+4}、x_{t+4} xtxt+2xt+4xt+4必须是相等大小的,这在架构设计上不灵活。这就是为什么RevNets (Gomez et al., 2017)在可逆单元之间引入了一些不可逆的下采样块,因此整个网络不是完全可逆的。更重要的是,我们发现没有明确的方法可以直接使用Eq. 1来桥接图1 (b)中的列。

为了解决这个问题,我们将方程1推广为以下形式:
 Forward :  x t = F t ( x t − 1 , x t − 2 , … , x t − m + 1 ) + γ x t − m  Inverse  : x t − m = γ − 1 [ x t − F t ( x t − 1 , x t − 2 , … , x t − m + 1 ) ] , \begin{array}{l} \text { Forward : } x_{t}=\boldsymbol{F}_{t}\left(x_{t-1}, x_{t-2}, \ldots, x_{t-m+1}\right)+\gamma x_{t-m} \\ \text { Inverse }: x_{t-m}=\gamma^{-1}\left[x_{t}-\boldsymbol{F}_{t}\left(x_{t-1}, x_{t-2}, \ldots, x_{t-m+1}\right)\right], \end{array}  Forward : xt=Ft(xt1,xt2,,xtm+1)+γxtm Inverse :xtm=γ1[xtFt(xt1,xt2,,xtm+1)],

其中m是指递归的阶数(m≥2)。显然,这种扩展仍然是可逆的。然后我们将每m个特征图分成一组:(x1,x2,…,xm),(xm+1,xm+2,…,x2m),…给定任何一组内的特征,我们可以很容易地根据方程2递归计算其他组的特征。与原始形式相比,方程2具有以下两个优点:

  • 如果m相对较大,则对特征图大小的约束大大放宽。请注意,方程1并不要求每个组内的特征图大小相等;这样的约束只存在于组之间。因此,我们可以使用不同形状的张量来表示不同语义级别或不同分辨率的特征。
  • 方程2可以很容易地与现有网络架构合作,即使后者不是可逆的。例如,我们可以将标准ResNet中的m个特征图分配给表示组 ( x t , x t + 1 , … , x t + m − 1 ) \left(x_{t}, x_{t+1}, \ldots, x_{t+m-1}\right) (xt,xt+1,,xt+m1)中的特征图,这仍然与方程2兼容,因为ResNet可以被视为 ( F t , F t + 1 , … , F t + m − 1 ) \left(\boldsymbol{F}_{t}, \boldsymbol{F}_{t+1}, \ldots, \boldsymbol{F}_{t+m-1}\right) (Ft,Ft+1,,Ft+m1)的一部分。因此,整个网络仍然是可逆的。

因此,我们可以将方程2重新组织成多列形式,如图2(b)所示。每一列由一个组内的m个特征图以及它们所属的母网络组成。我们将其命名为多级可逆单元,它是我们RevCol的基本组件,如图1(b)所示。

2.2、可逆列架构

2.2.1、MACRo设计

如引言中所述(参见图1(b)),我们的网络Rev Col由多个具有可逆连接的子网络组成,以执行特征解纠缠。图2(c)详细说明了体系结构的设计。遵循最近模型(Dosovitskiy等人,2020;Liu等人,2022b)的常见做法,首先将输入图像通过一个patch embedding模块拆分成不重叠的补丁。之后,将补丁馈送到每个子网络(列)。列可以用任何传统的单列架构实现,例如ViT(Dosovitskiy等人,2020)或ConvNeXt(Liu等人,2022b)。我们从每个列中提取四个级别的特征图,以传播列之间的信息;例如,如果列是由广泛使用的层次网络实现的(Liu等人,2021;He等人,2016;Liu等人,2022b),则我们可以简单地从每个阶段的输出中提取多分辨率特征。对于分类任务,我们仅使用最后一列的最后一级(第4级)的特征图以获取丰富的语义信息。对于其他下游任务,如目标检测和语义分割,我们使用最后一列中所有四个级别的特征图,因为它们同时包含低级和语义信息。

为了实现列之间的可逆连接,我们采用了方程2中提出的多级可逆单元,但以一种简化的方式:我们不是为每个非线性操作 F t ( ⋅ ) \boldsymbol{F}_{t}(\cdot) Ft()采用(m-1)个输入,而是仅采用当前列的1个低级特征x_{t-1}和前一列的1个高级特征 x t − m + 1 x_{t-m+1} xtm+1作为输入。这种简化并不破坏可逆属性。我们发现,更多的输入只能带来很小的精度提升,但会消耗大量的GPU资源。因此,方程2被简化为:
 Forward :  x t = F t ( x t − 1 , x t − m + 1 ) + γ x t − m  Inverse  : x t − m = γ − 1 [ x t − F t ( x t − 1 , x t − m + 1 ) ] . \begin{array}{l} \text { Forward : } x_{t}=\boldsymbol{F}_{t}\left(x_{t-1}, x_{t-m+1}\right)+\gamma x_{t-m} \\ \text { Inverse }: x_{t-m}=\gamma^{-1}\left[x_{t}-\boldsymbol{F}_{t}\left(x_{t-1}, x_{t-m+1}\right)\right] . \end{array}  Forward : xt=Ft(xt1,xtm+1)+γxtm Inverse :xtm=γ1[xtFt(xt1,xtm+1)].

与传统的架构相比,我们的RevCol的宏设计具有以下三个属性或优势:

特征解纠缠。在RevCol中,每个列的最低级别保持低级特征,因为它靠近输入,而最后一列的最高级别具有高度语义性,因为它直接连接到监督。因此,在列之间的(无损)传播过程中,不同级别的信息逐渐被解纠缠-一些特征图变得越来越语义化,一些保持低级。详细的分析在附录E中给出。该属性带来了许多潜在的优势,例如对同时依赖于高级和低级特征的下游任务更加灵活。我们认为可逆连接在解纠缠机制中起着关键作用-一些之前的工作如HRNet(Wang等人,2020)涉及多级特征融合,但没有可逆连接,这可能会导致信息损失,并在我们的实验中导致性能不佳(参见第3.5.2节)。

节省内存。传统网络的训练需要大量的内存足迹来存储前向传播过程中的激活,以满足梯度计算的需求。而在我们的RevCol中,由于列之间的连接是显式可逆的,因此在反向传播过程中,我们可以从最后一列到第一列重建所需的激活,这意味着我们只需要在训练过程中维护一个列的激活。在Section 3.5.4中,我们证明RevCol大约只需要\mathcal{O}(1)的额外内存,随着列数的增加。

大型模型的新缩放因子。在RevCol体系结构中,列数作为除深度(块数)和宽度(每个块的通道数)之外的一个新维度添加到普通单列CNN或ViT中。在一定范围内,增加列数与增加宽度和深度具有类似的收益。

2.2.2、MicRo 设计

我们默认使用ConvNeXt块(Liu等人,2022b)来实现我们网络中的每个列;其他架构,如transformer,也是适用的(详见附录B)。为了使ConvNeXt与我们的宏架构兼容,我们对它进行了一些修改:

Fusion模块。如图5所示,在原始ConvNeXt的每个级别中,输入首先在patch-merging块中被下采样。然后,输出通过一堆残差块。在RevCol中,我们引入了一个融合模块来融合来自当前列和前一列的特征映射(参见图2(c)中的绿色和蓝色连接)。我们对原始ConvNeXt中的patch-merging块进行了修改,将LayerNorm放在patch-merging卷积之后,而不是之前。patch-merging卷积的通道数加倍。我们还引入了一个上采样块,该块由线性通道映射层、LayerNorm归一化和特征图插值层组成。我们将线性通道映射层中的通道数减半。这两个块的输出相加,然后传递给残差块。

核大小。在RevCol中,我们将原始ConvNeXt(Liu等人,2022b)中的 7 × 7 7 \times 7 7×7卷积修改为 3 × 3 3 \times 3 3×3,主要是为了加速训练。增加核大小可以获得更高的准确性,但不会很多,部分原因是我们的多列设计扩大了有效感受野。有关更多详细信息,请参阅第3.5.5节。

可逆操作 γ \gamma γ。我们采用可学习的可逆通道缩放作为可逆操作 γ \gamma γ,以保持网络稳定。每次在式3的前向传播中,特征的幅度都会增大,这会使训练过程不稳定。使用可学习的缩放可以抑制特征的幅度。在训练期间,我们截断了 γ \gamma γ的绝对值,使其永远不会小于 1 e − 3 1 e^{-3} 1e3,因为当 γ \gamma γ太小时,数值误差可能在反向计算中变得很大。

2.3、中间监督

尽管多级可逆单元能够在列迭代过程中保持信息,但下采样块仍然可以丢弃列内的信息。前面几列末尾的特征太接近最终输出,因为可逆连接只进行缩放和求和。这种信息丢失会导致性能下降。类似的问题在使用深层监督方法(Lee等人,2015;Szegedy等人,2015)时也会发生。

为了缓解信息崩溃的问题,我们提出了一种中间监督方法,该方法在前面几列中添加了额外的监督。对于前面几列中的特征,我们希望尽可能保持特征与输入图像之间的互信息,这样网络在列内部丢弃的信息就会更少。考虑到RevCol逐渐分离语义和低级信息,提取和利用与任务相关的信息可以进一步提高性能。因此,我们需要最大化特征和预测之间互信息的下界。

受Wang等人(2021)的启发,我们在最后一级特征(第4级)中添加了两个辅助头。一个是解码器(He等人,2022),它重构输入图像,另一个是线性分类器。线性分类器可以按常规分类方式用交叉熵损失进行训练。解码器的参数通过最小化二元交叉熵重构损失进行优化。与常用的L1和L2损失相比,将重构的对数和输入图像的分布解释为比特概率(伯努利)输出更平滑的值,这使得它更兼容交叉熵损失。

对于某一列的中间监督,复合损失是上述两种损失的加权总和。需要注意的是,监督头可能不会添加到所有列中。对于所有变体的RevCol,我们通过经验将复合损失的数量设置为4(例如,对于8列的RevCol,监督头添加在第2、4和6列以及第8列)。

总损失 L \mathbf{L} L是所有复合损失的总和:
L = ∑ i = 1 n ( α i L B C E + β i L C E ) \boldsymbol{L}=\sum_{i=1}^{n}\left(\alpha_{i} \mathcal{L}_{\mathrm{BCE}}+\beta_{i} \mathcal{L}_{\mathrm{CE}}\right) L=i=1n(αiLBCE+βiLCE)

n 表示复合损失的总数。损失函数 L B C E \mathcal{L}_{\mathrm{BCE}} LBCE L C E \mathcal{L}_{\mathrm{CE}} LCE分别表示BCE损失和CE损失。\alpha_{i}和\beta_{i}的值随着复合损失数量的增加而线性改变。当复合损失被添加到前面的列时,我们使用较大的 α i \alpha_{i} αi值和较小的 β i \beta_{i} βi值来保持 I ( h , x ) I(\boldsymbol{h}, x) I(h,x)。在后面的列中,\alpha_{i}的值会减小,而 β i \beta_{i} βi的值会增加,这有助于提高性能。

3、实验部分

我们构建了不同的RevCol变体,包括RevCol-T/S/B/L,使其与Swin transformers和ConvNeXts的复杂度相当。我们还构建了一个更大的RevCol-XL和RevCol-H来测试扩展能力。这些变体采用不同的通道维度C、每个列的块数B和列数COL。这些模型变体的配置超参数如下:

  • RevCol-T: C=(64,128,256,512), B=(2,2,4,2), COL=4
  • RevCol-S: C=(64,128,256,512), B=(2,2,4,2), COL=8
  • RevCol-B: C=(72,144,288,576), B=(1,1,3,2), COL=16
  • RevCol-L: C=(128,256,512,1024), B=(1,2,6,2), COL=8
  • RevCol-XL: C=(224,448,896,1792), B=(1,2,6,2), COL=8
  • RevCol-H: C=(360,720,1440,2880), B=(1,2,6,2), COL=8

我们在ImageNet数据集上进行图像分类(Deng et al., 2009;Ridnik et al., 2021)。我们还在常用的MS-COCO (Lin et al., 2014)和ADE20k (Zhou et al., 2017b)数据集上对下游目标检测任务和语义分割任务进行了模型测试。训练和微调设置请参见附录d。此外,我们展示了带有transformer的RevCol在视觉和语言任务上的性能(见附录B)。

3.1、图像分类

在ImageNet(1.28M图像)数据集上,我们对RevCol进行了300个训练周期的训练,并采用了中间监督。超参数、数据增强和正则化策略遵循Liu等人(2022b)的方法。我们还使用更大的ImageNet-22K数据集(Ridnik等人,2021)对模型进行了预训练,该数据集包含14.2百万个图像。
在这里插入图片描述

在表1中,我们将RevCol变体与常见的最近Transformer和CNN在ImageNet-1k验证集上进行比较。我们的模型在具有相似复杂性的情况下优于大量的普通单列CNN和Transformer。例如,RevCol-S达到83.5%的Top-1准确率,比ConvNeXt-S高出0.4个点。当使用更大的ImageNet-22K数据集进行预训练时,RevCol-XL达到88.2%的Top-1准确率。由于RevCol在分类预训练中保留了一些与任务无关的低级别信息,放宽参数和FLOPs的约束并扩大数据集大小可以进一步提高我们模型的性能。为了进一步测试大型数据集的扩展效果,我们构建了一个168百万个图像的半标记数据集(参见附录C)。通过额外的数据预训练和ImageNet-1k微调,我们的RevCol-H达到90.0%的Top-1准确率。我们的结果进一步证明,使用RevCol,CNN模型也可以分享大型模型和大量数据预训练的红利。

3.2、目标检测

我们在目标检测任务上对所提出的RevCol进行了评估。实验使用级联掩模R-CNN (Cai & Vasconcelos, 2019)框架在MS-COCO数据集上进行。我们还使用HTC++ (Chen et al., 2019)和DINO (Zhang et al., 2022a)框架微调了我们最大的模型RevCol-H。

在这里插入图片描述

在表2中,我们将APbox和APmask与COCO验证集上的Swin/ConvNeXt进行比较,发现RevCol模型在类似计算复杂性的情况下优于其他同类模型。预训练中保留的信息有助于RevCol模型在下游任务中取得更好的结果。当模型大小增加时,这种优势变得更加明显。在Objects365(Shao等人,2019)数据集和DINO(Zhang等人,2022a)框架下进行微调后,我们最大的模型RevCol-H在COCO检测小型验证集上实现了63.8%的APbox。

3.3、语义分割

我们还使用UperNet(Xiao等人,2018)框架评估了RevCol主干在ADE20K语义分割任务上的表现。在下游微调过程中,我们没有使用中间监督。为了进一步探索我们模型的能力并达到领先的表现,我们采用了最近的分割框架Mask2Former(Cheng等人,2022),并采用了相同的训练设置。
在这里插入图片描述

在Tab. 3中,我们报告了验证集单尺度测试和多尺度翻转测试的mIoU。RevCol模型可以在不同模型容量上实现有竞争力的性能,进一步验证了我们架构设计的有效性。值得注意的是,当使用Mask2Former检测器和额外的预训练数据时,RevCol-H达到了61.0%的mIoU,这表明它在大规模视觉应用中具有可行的可扩展性。

3.4、与SOTA基础模型的系统级比较

基础模型(Kolesnikov等人,2020;Radford等人,2021;Yuan等人,2021b)是通用目的的主干网络,它们在大规模和多样化数据源上进行预训练,可以适应各种下游任务,只需使用有限的特定域数据。我们比较了各种公开的、最先进的(SOTA)基础模型,包括视觉转换器和视觉语言模型,即SwinV2(Liu等人,2022a)、BEiT3(Wang等人,2022)和Florence(Yuan等人,2021b)。如Tab. 4所示,尽管我们的RevCol-H是纯粹基于卷积的,并且是在单一模态数据集上进行预训练的,但它在不同任务上的结果都证明了RevCol具有出色的泛化能力,尤其是在具有大规模参数的情况下。
在这里插入图片描述

3.5、更多分析实验

3.5.1、可逆列架构的性能提升

在本节中,我们评估使用可逆列的性能增益。在第一个实验中,我们固定单个列的结构和FLOPs,然后简单地添加更多列来扩展大型模型并测试性能。同时,我们绘制了具有相似模型大小的原始单列模型。如图3所示,与单列模型相比,在相同的FLOPs约束下,使用多列可逆架构总是能获得更好的性能。此外,在一定范围内,与仅通过增加块数(深度)和通道数(宽度)扩展单列模型相比,通过增加列数来扩展RevCol具有相似的增益。在第二个实验中,我们将模型大小限制为约4.5G FLOPs,并测试了具有不同列数的模型变体。换句话说,我们逐渐添加更多列,同时逐渐减小单列的大小。结果如表5所示,我们注意到采用4到12之间的列数可以保持模型的性能,而进一步的更多列模型性能会下降。我们认为原因是单个列的宽度和深度过低,无法保持表示能力。
在这里插入图片描述

3.5.2、可逆网络与非可逆网络

在本节中,我们对可逆连接的不同设计模式进行消融实验。首先,我们使用HRNet的融合模块构建了一个非可逆的多列网络。其次,我们使用RevNet的设计构建了另一个单列可逆的ConvNeXt,如图2(a)所示。我们将这两种设计与我们的RevCol进行比较,评估结果如表6所示。非可逆多列网络在传播过程中存在信息损失,可能导致精度下降。可逆单列网络在传播过程中保持信息,但缺乏多级融合的优势。这个实验进一步表明将可逆设计与多列网络相结合的有效性。
在这里插入图片描述

3.5.3、使用中间监督的性能提升

在本节中,我们在ImageNet-1K上评估了使用和不使用中间监督的RevCol-T/S/B的性能。我们还评估了在MS-COCO数据集上使用1×训练计划的目标检测任务性能。其他设置保持不变。从表7中的验证结果可以看出,使用中间监督训练的模型取得了0.5%至0.9%的更好的top-1准确率。此外,中间监督也有利于下游任务,这进一步证明了其有效性。

3.5.4、GPU内存消耗与模型大小

图4绘制了GPU内存消耗与模型大小的关系。我们将单个列的计算复杂性固定为1G FLOPs,并增加列数。同时,我们测量了包括前向和后向传播在内的训练过程中的内存消耗。我们的实验是在Nvidia Tesla V100 GPU上进行的,批量大小为64,FP16精度和PyTorch实现。随着列数的增加,我们可以看到RevCol保持常数的GPU内存消耗,而非可逆架构的内存消耗随着列数的增加而线性增加。请注意,我们的RevCol并不严格保持相同的GPU内存消耗,因为可逆网络需要备份计算梯度所需的操作权重以及在反向传播中进行特征图的重建。
在这里插入图片描述

3.5.5、卷积中核大小的消融实验

在原始ConvNeXt中,使用大核卷积可以获得更好的性能。我们在RevCol-T中进行了实验。如表8所示,对于4列模型,使用5×5卷积使ImageNet-1k Top-1准确率提高了0.3%,使COCO AP_{box}提高了0.7%。进一步增加核大小可以在下游任务中获得更多准确度,但不会太多。我们认为RevCol设计已经扩大了有效感受野,这限制了使用大核卷积的准确度增益。另一方面,3×3卷积在(预)训练中具有效率和稳定性的优点。因此,我们在所有RevCol模型中采用核3。

4、相关工作

4.1、分离表示学习和部分-整体层次

分离表示通常被描述为一种将变化因素分离,明确表示数据的重要属性的方法(Desjardins等人,2012年;Bengio等人,2013年)。Desjardins等人(2012年);Kulkarni等人(2015年);Higgins等人(2017年);Chen等人(2016年);Karras等人(2019年)通过生成模型寻求学习分离表示。Locatello等人(2019年)指出,没有对所考虑的学习方法和数据集的归纳偏置,无监督学习分离表示从根本上来说是不可能的。最近的GLOM(Hinton,2021年)提议通过权重共享列来表示部分-整体层次。GLOM架构为深度神经网络提供了解释的部分-整体层次(Garau等人,2022年)。在RevCol中,我们采用了使用列的设计,但没有对形成岛屿的过程进行建模。相反,我们的列迭代过程维护了低级和高级信息,并逐渐将它们分离。RevCol可以使用端到端的监督进行训练,而不是使用自我监督的方法。

4.2、可逆网络

Gomez等人(2017)首次提出了可逆网络RevNet,可以在不保存中间激活的情况下进行反向传播。可逆设计显著节省了训练成本,因为它在模型深度扩展时保持O(1)的GPU内存消耗。Jacobsen等人(2018)提出了一种完全可逆的网络,可以在不损失任何信息的情况下返回到输入。Chang等人(2018)开发了一个关于深度神经网络稳定性和可逆性的理论框架,并推导出可以任意加深的可逆网络。Mangalam等人(2022)将可逆网络的范围从CNN扩展到了Transformer。我们的RevCol在RevBiFPN中将信息保留在每个列内,而不是整个BiFPN网络内。

5、结论

本文提出了一种基于可逆柱的基础模型设计范式RevCol。在通过列进行无损传播的过程中,学会了RevCol中的特征逐渐解纠缠,并且仍然保持总信息而不是压缩。我们的实验表明,RevCol可以在多个计算机视觉任务中获得具有竞争力的性能。我们希望RevCol能够在视觉和语言领域的各种任务中做出更好的贡献。

A、MICRO 设计细节

在本节中,我们将提供RevCol的架构设计细节。如图2和2.2节所示,我们的RevCol包含多个具有可逆连接的列。图5 (a)显示了ConvNeXt的架构。请注意,我们将ConvNeXt中的7 × 7深度卷积替换为3 × 3,如第2.2.2节所述。在图5 (b)中,我们详细展示了如何在ConvNeXt的基础上扩展到我们的RevCol。首先,我们用融合块替换下采样块,以融合当前列中的低级表示和前一列中的高级表示,图5 ©显示了融合块的细节,其中包含上采样和下采样操作,以处理不同的分辨率。其次,对于每个级别,来自前一列的相同级别表示被添加到当前级别的输出中,并准备作为一个整体传播。由于这两个修改,来自不同层次的特征映射聚合在一起形成中间表示。在图5 ©中,我们使用Linear-LayerNorm,然后使用最接近的插值来上采样低分辨率特征。一个步幅为2的2 × 2核Conv2d向下采样高分辨率特征,然后是一个LayerNorm来平衡两个输入的贡献。
在这里插入图片描述

B、概括Transformer

B.1、视觉Transformer模型

RevCol包含多个具有可逆连接的轻量级子网络。在本文中,除了多列融合和较小的卷积核外,我们默认采用ConvNext微设计,如第2.2.2节所述。然而,我们的RevCol的微设计不仅限于卷积网络,而且还与等变设计兼容,例如原始视觉Transformer(ViT)(Dosovitskiy等人,2020)。在本节中,我们展示了RevCol的微设计可以推广到原始ViT,即RevCol-ViT,并取得了有希望的实验结果。
在这里插入图片描述

Net-ViT保持了可逆列中的特征分辨率。因此,融合模块中的补丁合并块和上采样块被一个简单的线性投影和后LayerNorm所取代。我们使用的是原始的ViT构建块,而不是ConvNext构建块的变体。类似于Liu等人(2022a),在ViT块中使用后LayerNorm和归一化的点积注意力来稳定训练收敛。由于具有各向同性的性质,我们均匀地排列每个列中的构建块。RevCol-ViT的配置细节为:

  • RevCol-ViT-S: C=(224,224,224,224), B=(2,2,2,2), H E A D=4, C O L=4
  • RevCol-ViT-B: C=(384,384,384,384), B=(3,3,3,3), H E A D=6, C O L=4

除了丢弃各向异性的RevCol中的中间监督以简化模型,并将RevCol-B的随机深度率设置为0.2,我们使用与第3.1节中所述相同的训练设置。我们根据网络深度缩放每个FFN中的最后一个线性投影层的值,与BEiT(Bao等人,2021)相同。在表9中,我们将RevCol-ViT与原始ViT和其他同时各向同性的设计进行比较。我们的RevCol-ViT优于原始视觉Transformer(ViT为77.9%,DeiT为81.7%)和具有可比较模型参数和计算开销的卷积网络ConvNeXt(82.0%),在ImageNet-1k分类中以顶级-1准确率衡量。

B.2、语言模型

考虑到将Transformer应用于计算机视觉的成功,即ViT(Dosovitskiy等人,2020),我们也进行了一些探索,以将RevCol泛化到自然语言处理(NLP)。基于附录B.1中的设计,我们可以很容易地将各向同性的RevCol应用到语言模型中,只需进行少量修改。具体来说,我们用单词嵌入和位置编码替换了我们的RevCol中的stem模块,然后,RevCol可以作为编码器插入到原始的transformer中。RevCol中最后一个列的输出将用作注意力层的记忆键和值,这与原始的transformer完全相同。

我们选择翻译任务来评估RevCol在NLP中的潜力。我们在WMT’16英语-德语(En-De)数据集上进行了实验,该数据集包含450万个句子,以及更大的WMT’14英语-法语数据集,包含3.6亿个句子。每个句子都按照Sennrich等人(2016)的顺序,使用联合源编码和目标字节对编码进行编码。模型架构的细节和BLEU分数在表10中列出。

所有数据集的准备和训练配置都遵循Ott等人(2018)和开源项目fairseq。模型在En-De上训练30万步,批量大小为28672个令牌,在En-Fr上训练20万步,批量大小为86016个令牌。为简单起见,我们丢弃了中间监督。如Tab. 10所示,我们的RevCol在En-De(28.67 vs. 28.43)和En-Fr(43.40 vs. 43.07)上优于原始的Transformer,具有可比较的参数,这表明了RevCol对NLP的适用性。
在这里插入图片描述

B.3 列数量的鲁棒性

在论文的消融分析中,我们发现当总浮点运算次数保持不变并增加更多列的RevCol时,性能首先增加然后趋于饱和。当列的数量非常大时,例如20列,由于单个列的表示能力有限,性能会下降。当列的数量通常为4列或12列时,性能类似,这验证了列数量的设置鲁棒性。

为了进一步分析列数量的鲁棒性,本节构建了一些RevColViT-B变体(更多细节请参见附录B)。每个变体具有相同数量的残差块和相同的通道维度,但列的数量不同。换句话说,这些变体具有相同的通道维度,但每列的深度和列的数量不同。总共使用32个残差块并保持浮点运算次数约为18G。图6显示了不同变体在ImageNet-1K上的性能。列的数量为1、2、4和8,因此每列的深度分别为32、16、8和4。单列变体的性能较低(类似于DeiT-B(Touvron等人,2020)),因为单列ViT无法像多列可逆那样维护信息。当列的数量增加时,性能下降,因为每列的深度不够。这种现象表明,给定目标浮点运算次数,除非每列的深度或通道维度过小,否则列数量的设置是鲁棒的。

C. 半标注私人收集的大型模型数据集

C.1 数据收集和伪标签系统

该数据集包含约1.68亿(M)张图片,其中50M张带有标签,其余1.18亿张为未标记。大多数带标签的图片来自公共数据集,例如ImageNet、Places365(Zhou等人,2017a)和Bamboo(Zhang等人,2022b)。其他的是由内部员工标注的网络爬虫图片。未标记的图片来自弱注释的图像文本数据集,如YFCC-100M(Thomee等人,2016)。我们不使用文本注释。

为了利用不同标签域的图像和大量未标记的图像,我们采用了类似于Ding等人(2022a)和Ghiasi等人(2021)的多目标标签系统。我们采用了基于ViTs的半监督学习策略,从而生成质量不断提高的伪标签。我们只存储置信度高于1%的软预测结果以节省存储空间。我们使用的最终版本伪标签是由一个准确率为89.0%的Multi-head ViT-Huge教师模型生成的。

C.2 图像去重

由于数据集包含大量未经核实的网络爬虫图像,因此我们的训练数据集中可能混入了验证或测试图像。Mahajan等人(2018)和Yalniz等人(2019)的工作都认为图像去重对于公平的实验来说是一项重要的过程。

我们首先遍历整个数据集,根据它们的伪标签距离过滤出可疑的重复项以及相应的测试图像。这带来了超过10,000张具有高度可疑性的图像。我们查看这些图像对,并最终找到约1,200个完全重复和近似重复的图像。图7显示了一些近似的重复例子,这些是难以检测到的。然而,在我们的实验中,不删除这些重复项训练模型在ImageNet-1k上的准确率提高了不到0.1%。我们将这归因于这些重复项缺少真实标签。
在这里插入图片描述

D. 更多训练细节

本节提供了有关ImageNet分类、COCO检测和ADE20K分割的更多训练细节。

D.1 中间监督设置

我们在ImageNet-1k训练、ImageNet-22k和额外数据预训练中添加了中间监督。我们在ImageNet-1k训练中使用了3个块的解码器,特征图逐渐上采样。与第2.2节一样,块设置保持不变。在ImageNet-22k和额外数据预训练中,我们使用单层解码器。对于所有RevCol变体,我们将复合损失数n设置为3(例如,对于8列RevCol,中间监督添加到第2、4和6列,同时原始分类CE损失也添加到第8列)。 α i α_i αi设置为3、2、1、0, β i β_i βi设置为0.18、0.35、0.53、1。

D.2 用于训练和预训练的超参数

本节介绍了主要实验的训练细节,即在ImageNet和额外数据上进行的有监督训练。我们将在表11中展示此设置。除附加说明外,所有实验中的 ablation studies 都是在 ImageNet-1K 上进行有监督训练的,并且遵循本节中描述的设置。
在这里插入图片描述

D.3 用于微调的超参数

本节介绍了用于在ImageNet-1K进行微调的下流COCO目标检测和实例分割、ADE20K语义分割任务的超参数,如表12、表13和表14所示。
在这里插入图片描述
在这里插入图片描述

D.3.1、下游任务中的卷积核填充技巧

根据第3.5.5节的结果,较大的卷积核在下游任务中表现更好。为了节省预训练成本并获得更好的性能,我们将预训练模型权重中的3x3卷积核填充为较大的尺寸,然后在检测和分割任务中进行微调。受Net2net(Chen等人,2015)方法启发,我们在卷积层中用高斯初始化的值填充预训练的3x3核。为了保护预训练的核免受新填充值的影响,我们用0均值和极小的标准差(1e-7)初始化填充的值。我们只在最大的模型RevCol-H上使用此技巧。在COCO检测任务中,我们将预训练模型中的3x3核填充为7x7的核大小,在ADE20k语义分割任务中填充为13x13,然后在相应的数据集上进行微调以获得最终结果。一般来说,对于RevCol-H模型,核填充技巧可以使AP_box提高0.5~0.8个单位,mIoU提高 0.7   1.0 0.7~1.0 0.7 1.0个单位。

E、功能解耦的可视化

在本节中,我们将展示我们的RevCol如何使用堆叠列来解耦特征,这与传统的顺序网络不同。我们使用在ImageNet-1K上预训练的RevCol-S进行分析。首先,我们可视化每个级别最后一个层的输出类激活映射(CAMs)。我们采用LayerCAM(Jiang等人,2021)技术生成具有预测类别的CAMs。图8显示了激活的热力图。随着级别和列的深入,特征关注具有更多语义的区域。RevCol-S的输出是最后一列的不同级别。这些具有高级语义的特征关注图像的不同部分和对象的整个部分,实现了任务相关和任务无关的功能解耦。
在这里插入图片描述

为了定量评估解耦程度,我们使用Centered Kernel Alignment (CKA)相似度度量(Kornblith等人,2019年)来衡量RevCol-S中表示之间的相似性。我们计算不同级别和列之间的中间特征与每个类别在ImageNet验证集中的图像或标签之间的CKA相似性。然后,我们在图9中绘制了具有最高标签相似度的类别的相似性。如图所示,在第2-5列中,图像和中间特征之间的相似性在不同级别上没有明显区分,而第6-8列中具有较高级别的特征与图像的相似度较低。标签和中间特征之间的相似性在较高列中更为明显。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

App Inventor 2 什么情况下需要使用字典?

介绍 字典在其他语言中称为映射、关联数组或列表,是一种将一个值(通常称为键)与另一个值关联的数据结构。 Q:App Inventor 2 什么情况下需要使用字典? A:列表能完成字典的绝大部分功能,不过字…

YOLOv8改进 | 2023 | LSKAttention大核注意力机制助力极限涨点

论文地址:官方论文地址 代码地址:官方代码地址 一、本文介绍 在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv8,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,…

硬盘上不小心删除了重要文档?试试这6个成功率高的数据恢复工具!

您是否不小心重新格式化了存储卡或删除了想要保留的照片?最好的照片恢复软件可以提供帮助!如果您使用数码相机拍摄的时间足够长,那么当您错误地删除了想要保留的图像、重新格式化了错误的 SD 卡,或者发现您的珍贵照片由于某种莫名…

NB-IoT BC260Y Open CPU平台篇②AEP物联网平台天翼物联CWing

NB-IoT BC260Y Open CPU平台篇②AEP物联网平台天翼物联CWing 1、注册账号2、创建属于自己项目的产品3、协议解析:4、添加设备5、设备模拟测试:6、设备调试:最近做了几个项目,都是将终端产品连接到天翼物联Cwing平台和Onenet平台,个人感觉这2个平台功能还是挺全的比较好用。…

[SWPUCTF 2021 新生赛]PseudoProtocols

题目很明确了就是伪协议 php://filter/convert.base64-encode/resourcehint.php 提交的伪协议的内容需要是 I want flag,就会echo flag 方法1:adata://text/plain,I want flag 方法2:adata://text/plain;base64,SSB3YW50IGZsYWc

文献速递:人工智能(AI)用于神经学家:数字神经元会梦见电子羊吗?

这篇文章详细讨论了人工智能(AI)在神经学领域的应用及其对医疗保健行业的深远影响。主要内容可以分为以下几个部分: **1.AI和机器学习的基础知识:**文章首先解释了AI的基本概念,回顾了从最初的基于规则的方法到当前的…

Python潮流周刊:Twitter 的强敌 Threads 是用 Python 开发的!

🦄文章&教程 1、聊一聊 Python 和 Golang 的垃圾回收 常见的垃圾回收算法有哪些,它们的优缺点是什么?Python 的垃圾回收机制由什么组成,如何解决内存泄漏问题?Golang 的垃圾回收机制又是怎样的,如何解…

模块的学习

模块合包的基本概念: 模块(module):在python中,xx.py文件,就可以被看作模块 包(package): 用来管理和存放模块的文件夹,就被称为包&…

CleanMyMacX4.14.5macOS电脑系统免费清理工具

CleanMyMac X是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件,修复系统漏洞,一键扫描和优化Mac系统,…

安卓开发——Android Studio常见报错与解决方法

1. No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-android 这个错误是由于较新版本的NDK的./toolchains目录中没有arm-linux-androideabi文件,解决办法是从旧的NDK版本里面把相关的lib复制到要使用的NDK的版本里面&#xff0c…

ubuntu环境删除qtcreator方法

文章目录 方法1方法2方法3参考不同的安装方法,对应不同的删除方法 方法1 apt-get或者dpkg 方法2 QtCreatorUninstaller 方法3 MaintenanceTool

Clion在Windows下build时出现undefined reference,即使cmake已经正确链接第三方库(如protobuf)?

你是否正在使用clion自带的vcpkg来安装了protobuf? 或者你是否自己使用visual studio自己编译了libprotobuf.lib? 你是否已经正确在CmakeLists.txt中添加了以下命令: find_package(Protobuf CONFIG REQUIRED) include_directories(${Protobu…

中文地址命名实体识别训练和预测

效果 github项目地址 https://github.com/taishan1994/pytorch_bert_bilstm_crf_ner 下载项目 放在这个位置“F:\Python\github\ultralytics-main\submain\pytorch_bert_bilstm_crf_ner-main” 训练和预测步骤 1、下载数据集 从github项目可以找到数据集下载地址 https:…

个人硬件测试用例入门设计

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 🌤️功能测试 进行新增、…

yolov5从英伟达平台移植到华为昇腾开发板上的思路

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近需要将yolov5代码从英伟达平台移植到华为昇腾开发板上。搜了一些代码和资料,大致明白了二者的差别。 1.二者使用的模型文件不一样 yolov…

葡萄酒如何按颜色进行分类?

在世界众多的葡萄酒中,葡萄酒的颜色受品种、产区和酿造方法影响,可谓多种多样,用万紫千红形容也不为过。为了更好辨识,一般葡萄酒根据不同颜色,分为三个大类即:红葡萄酒、白葡萄酒、桃红葡萄酒。 红葡萄酒…

表单考勤签到作业周期打卡打分评价评分小程序开源版开发

表单考勤签到作业周期打卡打分评价评分小程序开源版开发 表单打卡评分 表单签到功能:学生可以通过扫描二维码或输入签到码进行签到,方便教师进行考勤管理。 考勤功能:可以记录学生的出勤情况,并自动生成出勤率和缺勤次数等统计数…

五种多目标优化算法(NSDBO、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(MATLAB代码)

一、多目标优化算法简介 (1)非支配排序的蜣螂优化算法NSDBO 多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)-CSDN博客 (2)NSGA3 NSGA-III求解微电网多目标…

两年功能五年自动化测试面试经验分享

最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变。初次的面试就碰到个工作年限比我长的,也没有时…

Java核心知识点整理大全13-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…