Open-world Semi-supervised Novel Class Discovery(论文翻译)

摘要

传统的半监督学习任务假设标记和未标记数据遵循相同的类分布,但现实的开放世界场景更复杂,未知的新类混合在未标记集中。因此,它是一个巨大的挑战,不仅要识别样本从已知的类,但也发现未知数量的新的类中的未标记的数据。在本文中,我们介绍了一种新的开放世界的半监督新类发现方法命名为OpenNCD,一个基于多个原型的渐进的双层对比学习方法。所提出的方法是由两个相互增强的部分。首先,介绍了一种双层对比学习方法,该方法保持了原型和原型组级别的成对相似性,以实现更好的表示学习。然后,基于共同的代表实例,提出了一个可靠的原型相似性度量。具有高相似性的原型将逐步分组,用于已知类识别和新类发现。在三个图像数据集上进行了大量的实验,结果表明,该方法在开放世界的情况下,特别是与稀缺的已知类和标签的有效性。

1介绍

现代深度学习方法受到了广泛关注,并随着标记数据集迅速发展。尽管有许多优势,大多数的方法是基于一个封闭世界的假设,其中类分布在测试阶段保持不变。但在现实的开放世界中,封闭世界的假设几乎不能成立,新的类很可能出现在未标记的集合中。例如,在自动驾驶领域,模型不仅需要识别预先训练的交通标志(已知类),还需要发现未知障碍物(新类)。对于网络安全,管理人员需要检测网络入侵并将其分类为现有类型或未知数量的新型攻击。因此,如图1所示,与封闭世界设置相比,开放世界场景更加复杂,具有以下挑战。
在这里插入图片描述

图1:开放世界半监督新类发现任务的图示,其中在半监督学习中的未标记数据中存在一些未知的新类。其目的是识别来自已知类别的样本,同时发现未知数量的新类别内的未标记数据。

挑战1如何识别已知类别并检测混在无标签数据集中的未知类别样本?传统的半监督学习任务假设在关闭世界的设置下进行,即无标签集中的类别与已知标记集相同。但在开放世界的场景中,未知类别样本混在无标签集中。为解决这个问题,一些鲁棒的半监督学习方法 [Guo等,2020;Huang等,2021] 被提出,其中所有检测到的新样本被简单粗暴地视为离群值。最近提出的ORCA [Cao等,2022] 能够同时对无标签集中的不同新类别进行聚类,但它假设新类别的数量是预定义的。
挑战2如何更好地利用额外的不相交标记数据集来对无标签集中的新类别进行聚类?为了解决这个挑战,一些新的类别发现方法 [Han等,2019b;Han等,2019a] 被提出,试图利用额外的标记数据集中的有用知识来更好地对无标签数据中的新类别进行聚类。然而,大多数方法都假设在测试阶段所有样本都来自新类别。因此,这些方法无法识别与未知类别混在一起的已知类别样本。最近,GCD [Vaze等,2022] 将新类别发现任务推广到进一步识别无标签集中的已知类别。但是,预测只能以一种转导方式进行,需要整个测试集的参与
挑战3: 如何估计未知类别的数量并匹配合适的聚类层次?一些传统方法 [Pelleg等,2000;Hamerly和Elkan,2003] 和最近的深度学习方法 [Leiber等,2021;Ronen等,2022] 被提出来估计无监督聚类任务中的聚类数量。然而,确定聚类层次是困难的,因为复杂数据集中通常存在多个不同的聚类层次。例如,CIFAR-100数据集有100个类别,它们还可以分为20个超类别。对于开放世界设置,一些有标签的样本可以用来更好地确定最适合的聚类层次

本论文旨在解决上述三个开放世界挑战,即对未标记数据中已知类别的识别和任意数量的新类别的发现。为此,提出了一种名为OpenNCD的逐步双层对比学习方法,它由两个相互增强的部分组成。首先,引入了一种双层对比学习方法,以在原型和原型组水平上保持成对相似性,从而实现更好的表示学习。涉及的原型和原型组可以被视为细粒度层次(子类别层次)和粗粒度层次(真实类别层次)上相似实例的代表性点。然后,基于常见表示实例的Jaccard距离,提出了一种新的可靠相似性度量。最相似的原型将被分组在一起表示同一类别。最后,原型组与真实标记类别相关联,用于已知类别识别和新类别发现。
我们的贡献总结如下:
• 我们提出了一种新的方法,可以同时解决开放世界学习中的三个挑战。
• 我们引入了一种双层对比学习方法,以实现更好的表示学习。
• 我们设计了一种新颖可靠的方法,通过逐步对原型进行分组来进行新类别的发现。

2 相关工作

2.1 Semi-supervised学习

传统的半监督学习方法(如Lee等人,2013;Xie等人,2020;Berthelot等人,2019;Sohn等人,2020;Li等人,2021)假设数据集中有标记和未标记样本,且未标记样本的类别与标记样本相同,即为封闭集场景。然而,在现实的开放世界中,存在未知的新类别,且这些新类别常常混在未标记样本中,这很可能对已知类别的分类性能造成显著下降。为了解决这个问题,一些鲁棒的开放集半监督学习方法(如Chen等人,2020b;Yu等人,2020;Guo等人,2020;Huang等人,2021)被提出。这些方法通常将检测到的新类别视为带有较低权重的离群样本,在训练阶段减少其影响,但它们无法识别检测到的新样本中的不同新类别。最近,ORCA(Cao等人,2022)提出了一种新的方法,在识别已知类别的同时进一步对新类别进行聚类。然而,它假设未知新类别的数量是预先定义的,而在开放世界的情况下,这几乎是不可能的。

2.2 新类别发现

新类别发现任务旨在利用一个类似但不重叠的额外标记集,来对未标记的新类别进行聚类,这是几种现有方法的提出 [Han等,2019b; Han等,2019a; Brbi´c等,2020; Zhong等,2021]。然而,这些方法假设在测试阶段所有样本都属于新的未知类别。因此,虽然这些方法能够发现未标记集中的新类别,但无法识别明确存在于开放世界环境中的已知类别。最近,GCD [Vaze等,2022]将新类别发现任务推广到了对未标记集中已知类别的进一步识别上。它依赖于经过充分训练的视觉变换器(ViT)模型 [Dosovitskiy等,2020]来提取更好的视觉表示。然而,在测试阶段,需要对所有测试样本进行聚类以获得最终的预测结果,这无法直接进行预测。

2.3 类别数量估计

在开放世界场景中,类别或聚类的数量无法事先获得。为了在聚类过程中估计类别的数量,大多数传统方法 [Pelleg等,2000; Hamerly和Elkan,2003; Kalogeratos和Likas,2012] 首先初始化一定数量的聚类,然后使用一种准则来确定在迭代过程中是否应该拆分或合并聚类。在深度聚类领域,只有少数最近的工作 [Leiber等,2021; Ronen等,2022] 包括聚类数量估计的方法。然而,数据集中的样本可以根据不同的层次结构进行聚类,因为一个类别可以进一步划分为几个子类别。因此,很难选择准确的阈值来获得最合适的聚类层次结构。在开放世界场景中,可以通过将未标记数据与标记数据进行匹配来确定聚类层次结构,从而更好地估计类别的数量。

3 提出的方法

3.1 问题的定义

给定一个数据集,包括已标记的部分Dl和未标记的部分Du。我们将已标记部分表示为Dl = {(xi, yi)}m
i=1,其中标签yl来自类别集合Yl。我们将未标记部分表示为Du = {(xi)}n
i=1,其中未知的标签yu来自未知类别集合Yu。在我们的开放世界设置中,未标记集合Du包含了一些在已标记集合中不存在的新类别,即Yl ⊂ Yu。我们将Ynovel = Yu/Yl定义为新类别集合。此外,与现有方法不同的是,我们的设置中,新类别的数量|Ynovel|是一个未知值,需要进行估计。
在这里插入图片描述
图2:提出的OpenNCD方法由两个相互增强的部分组成。首先,双层对比学习方法在原型级别Lproto和原型组级别Lgroup上维持正样本x和x’的相似性,以实现更好的表示学习。原型先验正则项Lreg防止原型的崩溃,而多原型交叉熵项Lce旨在维持已知类别的识别性能。随着模型的表示能力的提升,相似的原型逐渐被分组。

3.2 框架

为了处理这一具有挑战性的任务,我们引入了一种新颖的逐步双层对比学习方法,通过多个原型来进行训练,以在特征空间中表示实例。我们设计了一种双层半监督对比学习方法,用于学习更好的表示。我们还提出了一种新的方法,以逐步的方式对相似的原型进行分组,以实现未知新类别的发现。

如图2所示,整个框架由特征提取器fθ和特征空间中的多个可训练原型C = {c1, …, cK}组成。原型的数量K是预先定义的,远远超过潜在真实类别的数量。我们还进行了一个实验,研究不同K值的影响。通过计算实例与原型之间的分配概率,并进一步利用这些概率进行双层半监督对比学习方法,以学习更好的表示来进行类别发现。

为了对未标记的原型进行分组并发现类别,我们提出了一种基于共同表示实例的度量方法,用于衡量属于同一类别的两个原型之间的相似性。在训练阶段,原型会逐步进行分组。随着编码器网络表示能力在迭代训练中的增强,同一类别的实例会更加紧密,相应的原型之间也会更加相似。通过这种方式,我们可以找到可靠的原型组,并估计新类别的数量。所提出方法的目标函数包括四个组成部分:
在这里插入图片描述
其中,前两个项是双层对比损失,包括原型级别的相似性损失 Lproto 和群组级别的相似性损失 Lgroup。Lreg 是原型熵正则化损失,Lce 是多原型交叉熵损失。

3.3 双层对比学习

原型级别的相似性。给定来自特征提取器的实例特征 z 和一组原型 C = {c1, …, cK},我们用 p ∈ R(m+n)×K 表示基于余弦相似度的实例 z 到原型集合 C 的分配概率。其中,z 到第 k 个原型 ck 的分配概率表示为:
在这里插入图片描述
这里,τ 是温度尺度,而 z 和 c 都进行了 l2 归一化处理。

采用成对的半监督对比学习技术进行表示学习。训练批次中的每个实例都被视为锚点。如果该实例有标签,则通过从相同类别中随机选择另一个实例来获取正样本;如果该实例没有标签,则选择其最近邻实例作为正样本。然后选择锚点的增强视图与选定的正样本计算相似度,以增加对比学习的差异性。

为了使正样本对中的两个实例具有相似的分配概率,我们定义了原型级相似性损失,如下所示:
在这里插入图片描述
其中pi和p’i表示锚点和其正样本的分配概率,<.>表示余弦距离。值得注意的是,我们直接利用同一训练小批次中的实例作为正样本来更新编码器和原型,而不是从整个数据集中进行负样本采样。通过这种方式,提出的模型可以在线上对大规模数据集进行训练和更新。

组级相似性。上述的原型级相似性损失使得实例被精细的原型所表示。为了学习更好的表示以进行类别识别,实例还应该在更粗粒度的原型组级别上进行表示,以匹配真实的类别层次结构。为此,我们引入了一个组级相似性损失,通过在原型组级别上表示实例来实现。

形式上,一个原型组 Cg 是一组相似的原型,很可能表示同一类别,其中 Cg ⊂ C,任意两个原型组是不相交的。原型以渐进的方式进行分组,用于类别发现,详细的分组过程在第3.4节中有说明。然后,实例特征 z 到原型组 Cg 的分配概率可以通过以下方式获得:

在这里插入图片描述
并且组级相似性损失可以表示为:
在这里插入图片描述
其中,qi 和 qi‘表示正样本对中两个实例的分配概率,可以互相视为组级别的伪标签。需要注意的是,这里我们采用了与公式3不同的对比相似性损失形式,以从不同的角度提取知识以防止过拟合。此外,公式5与交叉熵具有相同的形式,使模型更加关注组或类别的区分。

**原型正则化。**由于多个原型用于表示特征分布,优化过程中可能会忽略一些分配概率较低的原型或组。更严重的是,在某些情况下,所有实例都被分配给同一个原型,导致模型崩溃。为了解决这个问题,我们引入了原型正则化项,通过Kullback-Leibler(KL)散度,使原型的边际分配概率pproto ∈ RK接近于平衡先验pprior,公式如下所示:
在这里插入图片描述
其中,
在这里插入图片描述
我们期望防止所有实例都被分配到同一个原型组时可能发生的崩溃,并同时确保所有原型都被用于表示复杂类别分布的不同特征。因此,我们设计了先验pprior,使原型组之间和组内的原型之间呈均匀分布,表示为:
在这里插入图片描述
其中k表示第k个原型ck的先验,Ng是当前阶段所有原型组的数量,|Ck|是ck所属组的原型数量。

多原型交叉熵。上述目标主要集中在无监督表示学习上。为了进一步提高已知类别的识别能力,引入了监督的多原型交叉熵损失。需要注意的是,在渐进分组阶段,原型组是无标签的,我们希望原型组能够与真实的类别级别相匹配,其中每个原型组代表一个类别。为此,我们利用匈牙利算法[Kuhn, 1955]将已知类别与原型组进行匹配。这样,对于有标签的实例,我们可以得到它们在原型组上的真实标签。然后,监督的多原型交叉熵损失定义为:
在这里插入图片描述
其中qi^(y)表示实例的真实标签所对应的原型组的分配概率,表示为:
在这里插入图片描述
请注意,方程9与方程5具有类似的形式。不同之处在于,方程5将另一个视图的组分配概率视为伪标签,而方程9直接使用真实标签。

3.4 从原型到类别:渐进式原型分组

在这一部分,我们详细说明原型分组的过程,目的是逐步发现未知数量的新类别。

首先,我们提出了一种新的相似性度量方法,用于判断两个原型之间的相似性,如图3所示。具体而言,对于一个实例特征z,它的分配概率p在所有原型上进行排序。具有前κ个最大分配概率的原型被视为与z相关的原型,并且反过来,z被视为原型c的表示实例。原型c的所有表示实例的集合被表示为:
在这里插入图片描述
在这里插入图片描述
图3:相似度度量。在这个例子中,每个实例都有3个相关的原型(根据所有原型的前3个分配概率)。相似度分数通过计算两个原型的表示实例集合的杰卡德距离来确定。

直观上,如果两个原型具有更多共同的表示实例,则它们更有可能属于同一类别。因此,我们通过计算它们的表示实例集合的杰卡德距离来计算两个原型之间的相似度得分,公式如下:
在这里插入图片描述
在每个时期,计算每两个原型之间的相似度以形成一个亲和矩阵。然后可以利用一些基于图的聚类方法来检测密集连接的原型,这些原型被视为原型组。一种简单的方法是通过链接的原型来找到原型组,其中相似度超过一定阈值δ。还有一些不需要预定义类别数量的方法也可以工作,例如Louvain算法[Blondel等,2008]和亲和传播算法[Frey和Dueck,2007]。为了确保新的类别被聚类到与已知类别相同的层次级别,阈值δ(或用于控制聚类层次的参数)通过在标记的已知类样本上达到最高准确率而自动调整。随着特征提取器和原型的表示能力的增强,可以逐渐获得更可靠的原型组。

4 实验

4.1 实验设置

数据集 我们提出的方法在标准图像分类任务中评估了三个广泛使用的数据集,包括CIFAR-10 [Krizhevsky, 2009]、CIFAR-100 [Krizhevsky, 2009]和ImageNet-100。其中,ImageNet-100是从ImageNet [Deng等,2009]中随机抽取的具有100个类别的子集,用于应对其大规模数据量。对于每个数据集,前50%的类别被视为已知类别,而剩下的50%被视为未知类别。此外,仅有已知类别中的10%被标记,未知类别和其余已知类别均未标记。

**评估指标。**遵循[Cao等,2022]中的评估协议,我们对已知类别和未知类别的性能进行评估。对于已知类别,在测试阶段测量分类准确率。对于未知类别,通过使用匈牙利算法[Kuhn, 1955]解决预测目标类别分配来计算聚类准确率。此外,我们还计算已知类别和未知类别样本的聚类准确率,以衡量所提出模型的整体性能。

实现细节。在所提出的方法中,ResNet-18被用作特征提取器的主干,该主干经过SimCLR [Chen等,2020a]的无监督预训练。为了避免过拟合,我们固定主干网络的前三个块的参数,并只微调最后一个块。对于CIFAR-10数据集,使用50个原型;对于CIFAR-100和ImageNet-100数据集,使用500个原型,固定维度为32。我们采用Adam优化器,学习率为0.002,并在所有实验中将批量大小设置为512。温度尺度τ设置为0.1,这是大多数先前方法的建议值,目标函数中最后两项的权重设为{λ1,λ2} = {1,1}。原型分组中的κ设为5。

4.2 与基线比较

基准方法。我们将我们提出的方法与两种基准方法ORCA [Cao等,2022]和GCD [Vaze等,2022]进行比较。ORCA是针对预定义数量的新类别的开放世界半监督学习问题提出的方法。为了保持一致性,我们的实验设置遵循ORCA在其公开代码中的协议。GCD使用了更复杂的预训练主干网络,在初始化阶段就展现出了高性能,为了进行公平比较,我们将其在公开代码中的主干网络替换为与我们设置相同的ResNet-18网络。值得注意的是,在ORCA的原始论文中,已知类别的标记数据比例设置为50%,这对于半监督学习来说是一个相对较高的比例。在这里,我们考虑在更具挑战性和一般性的情况下进行比较,只有10%的已知类别数据被标记。我们还在附录中的表4中报告了标记比例为50%的额外结果。

扩展基准方法。我们还将最近的新类别发现方法和鲁棒的半监督学习方法扩展到我们的开放世界设置中进行比较。新类别发现方法只能对新类别进行聚类,无法将未标记的样本分类到已知类别中。在这里,我们比较了两种新类别发现方法:DTC [Han等,2019b]和RankStats [Han等,2019a]。为了将它们扩展用于已知类别识别,我们将已知类别样本视为未知类别,并按照正常未知类别的方式对其进行检测。然后,我们使用匈牙利算法进行标签匹配,并报告准确率传统的半监督学习方法无法发现混在未标记数据中的新类别。我们选择了两种方法:FixMatch [Sohn等,2020]和DS3L [Guo等,2020],并将它们扩展为新类别发现。通过选择置信度或权重较低的样本作为未知类别样本,使用k-means对其进行聚类,并报告聚类准确率。
在这里插入图片描述
Table 1: 已知类别、新类别和所有类别的准确率比较。数据集由50%的已知类别和50%的新类别组成,其中只有10%的已知类别被标记。星号(*)表示原始方法无法识别已知类别,通过将发现的聚类与标记数据中的类别进行匹配来进行扩展。†符号表示原始方法无法发现新类别,通过对未知样本进行聚类来进行扩展。
在这里插入图片描述
Table 2: 未标记数据中的类别数量估计。我们报告了在CIFAR-10数据集上进行的5次平均实验结果。

比较结果:所有对比方法的结果都在表1中呈现,包括已知类别、新类别和所有类别的准确率。作为额外的基线,我们还直接在SimCLR预训练的编码器的输出特征上运行k-means,并包含没有额外训练的结果。由于大多数基线方法无法处理类别数量估计任务,我们假设所有方法都已知新类别的数量。对于扩展方法,"所有"分数不是"已知"和"新"分数的平均值,因为标记的分数 (∗或†)是以一种扩展和不同的方式计算的。表1中的结果表明,在开放世界设置中,传统方法很难同时识别已知类别和聚类新类别。然而,我们提出的方法可以有效地处理这些复杂任务,并具有比基线方法更好的性能。

4.3 评估类的数量

在之前的实验中,我们假设已知新类别的数量是已知的,因此我们进一步在真实新类别数量未知的情况下进行了实验。为此,我们将提出的方法与一些传统的类别数量估计方法进行了比较,包括X-means、G-means和最近的深度聚类方法DipDeck。对于这三种方法,我们从预训练的主干网络中提取了CIFAR-10数据集的特征,与我们的方法相同。由于这三种方法都是无监督的,我们在两个设置下报告了我们方法的结果:(a)没有标记数据进行训练,与这三种方法相同;(b)使用了50%的已知类别和50%的新类别,并对已知类别的10%进行了标记,与之前的实验相同。表2中的结果表明,我们提出的方法即使在没有标记数据的情况下,也可以更好地处理类别数量估计任务。
在这里插入图片描述
表3:目标函数组成部分的消融分析。我们在CIFAR-100数据集上报告了结果,其中有50%的已知类别和50%的新类别,已知类别中有10%进行了标记。

4.4 消融和分析

消融研究。在表3中,我们分析了我们提出的方法中不同损失函数部分的贡献,包括原型级别相似性损失Lproto,组级别相似性损失Lgroup,多原型交叉熵损失Lce和原型正则化损失Lreg。为了研究这些项的重要性,我们分别从目标函数中移除每个项进行了消融研究。从表3可以推断出,所有组成部分都对我们的方法有贡献。此外,去除Lgroup后的结果显示了聚类的重要性,去除Lproto后的结果证明了多原型在表示学习中的好处。

Novel类别比例的影响。如图5所示,我们在CIFAR-10数据集上评估了不同Novel类别比例的性能,比例范围从0.1到0.9。我们通过无监督聚类准确性报告了所有类别的准确性,这可以被视为整体性能的良好代理。尽管由于Novel类别比例的增加而不可避免地导致性能下降,但OpenNCD仍然表现优于两个强基线方法,尤其是在较高的Novel类别比例下。图5的结果表明,我们提出的方法能够更好地应对更高开放性的任务场景。
在这里插入图片描述
Figure 4: CIFAR-10数据集的特征表示的T-SNE可视化,包括50%已知类别(10%标记)和50%新类别,使用(a) SimCLR预训练的ResNet-18,(b) ORCA(基准方法),© OpenNCD(我们的方法)与50个原型。颜色表示不同的类别。
在这里插入图片描述
Figure 5: 在不同的新类别比例下,ORCA、GCD和我们提出的方法在CIFAR-10数据集上的性能。

多个原型的好处。为了研究原型数量K的影响,我们在CIFAR-10数据集上进行了实验,将原型数量从实际类别数(10)增加到较大的数量(500)。结果如图6所示。可以观察到,使用多个原型而不是单个原型来代表每个类别的分布可以提高已知类别和新类别的性能。此外,使用单个原型来代表类别分布需要先验知识来确定新类别的数量。当新类别的数量未知时,使用多个原型来代表类别分布,并逐步进行分组以发现新类别。进一步增加原型的数量不会导致表示学习的持续改进,性能趋于稳定。我们仍然可以推断,在数据分布更复杂且更难逼近的情况下,增加更多的原型会有益处。
在这里插入图片描述
图6:在CIFAR-10数据集上,随着原型数量从10(每个类别一个原型)增加到300时的性能表现。

特征空间的可视化。在图4中,我们展示了在CIFAR-10数据集上,原始的预训练ResNet-18网络、ORCA方法以及提出的OpenNCD方法学习到的潜在空间。通过T-SNE算法将高维的潜在特征降维到2D进行可视化。如图4(a)所示,原始的ResNet-18特征混杂在一起,没有形成清晰的聚类。在图4(b)中展示的ORCA的潜在空间中,实例特征更加分离,但形状不规则,并且聚类不够紧凑。相比之下,图4©展示了提出的OpenNCD的潜在空间,其中特征由50个原型和10个原型组表示,并以不同的颜色进行区分。我们可以看到原型在每个组内是连接在一起的,特征紧密分布在相关的原型和组周围,形成非常紧凑和清晰的聚类,这有利于我们的渐进式原型分组方法来发现新的类别。

5 总结

本文中,我们在开放世界的环境中同时解决了已知类别识别、新类别发现和类别数量估计三个挑战。为此,我们提出了一种名为OpenNCD的新方法,其中包含两个相互增强的部分。首先,我们采用双层对比学习方法来维护原型和原型组之间的相似性,以实现更好的表示学习。然后,基于一种可靠的相似性度量,我们提出了一种渐进式原型分组方法,将原型进行分组,并将其与真实的标记类别相关联,以实现新类别的发现。我们进行了大量实验证明,我们提出的方法能够有效应对开放世界环境下的挑战,并且优于先前的方法。

本工作得到中国中央高校基本科研业务费(ZYGX2019Z014)、四川省重点研发计划(22ZDYF3388)、国家自然科学基金(61976044,52079026)以及福庸同教育基金会(161062)的支持。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄阳老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值