Distilling Knowledge from Graph Convolutional Networks

摘要

现有的知识蒸馏方法主要集中在卷积神经网络(CNN)上,其中像图像这样的输入样本位于网格域中,而在很大程度上忽略了处理非网格数据的图卷积网络(GCN)。在本文中,我们提出了第一种专门从预先训练的GCN模型中提取知识的方法。为了实现从教师GCN到学生的知识转移,我们提出了一个局部结构保持模块,该模块明确说明了教师的拓扑语义。在本文中,教师和学生的局部结构信息都被提取为分布,因此,最小化这些分布之间的距离可以实现拓扑感知知识转移。产生一个紧凑但高性能的学生模型。此外,所提出的方法很容易扩展到动态图模型,其中教师和学生的输入图可能不同。我们使用不同体系结构的GCN模型在两个不同的数据集上对所提出的方法进行了评估,并证明我们的方法在GCN模型中实现了最先进的知识提取性能。

1. 介绍

深神经网络(DNNs)在几乎所有的计算机视觉任务中都显示出了前所未有的结果。然而,最先进的性能以非常高的计算和内存负载为代价,在许多情况下,这就妨碍了在边缘部署DNN。为此,提出了知识蒸馏,它模型压缩的主要流程之一。以经过预先训练的繁琐网络为教师模型,通过从教师那里转移知识,学习一种紧凑的学生模型,从而掌握教师的知识。

知识蒸馏的有效性已经在许多任务中得到验证,学生的表现与教师的表现密切相关。尽管已有的知识蒸馏方法取得了令人鼓舞的进展,但已有的知识蒸馏方法一直集中在卷积神经网络(CNNs)上,其中图像等输入样本都位于网格域。然而,许多现实数据,如点云(point clouds),都采用非网格结构的形式,如图,因此需要图卷积网络(GCNs)[35、10、17、12]。GCNs通过对图的局部语义和全局语义的探索,明确地研究了数据的拓扑结构。因此,传统的知识蒸馏方法,仅仅是对输入数据的输出或中间激活的解释,忽略了输入数据的拓扑上下文,已不能充分地进行知识的传递。

本文介绍了我们最了解的第一种专门的知识蒸馏方法,该方法适合于GCN。如果有一个受过训练的教师GCN,我们的目标是训练具有更少层数或者更低维度的特征图,甚至是一个边较少的较小图形的。GCN蒸馏的核心是能够对隐藏在图中的拓扑信息进行编码,而在基于CNN的现有方法中,这种能力是不存在的。如图1所示,本方法考虑了节点的特点以及它们之间的拓扑连接,从而为学生模型提供了教师嵌入的拓扑结构的更丰富、更关键的信息。

我们在图2中说明了所提出的GCN知识蒸馏方法的工作流程。设计了一个局部结构保持(LSP)模块,明确地解释了图语义。针对节点的嵌入特性和师生图的特点,LSP模块测量了它们之间的拓扑差异,并指导学生模型像教师模型一样进行相似的拓扑嵌入。具体来说,LSP首先为学生和教师的每个局部结构生成分布,然后通过最小化分布之间的距离来强制学生学习相似的局部结构。此外,我们的方法可以很容易地扩展到动态图模型,其中的图不是静态的,而是由教师和学生模型动态构建的。

为了观察蒸馏性能,我们对不同领域的两个不同任务进行了评价,包括用于节点分类的蛋白质-蛋白质交互数据集和三维对象识别的ModelNet40。这两个任务中使用的模型在不同的体系结构中。实验结果表明,该方法在所有比较方法中均能达到最佳的知识蒸馏性能,验证了该方法的有效性和推广性。

我们的贡献总结如下:
•我们介绍了一种从图卷积网络中提取知识的新方法。据我们所知,这是第一个专门为GCN模型定制的知识提取方法
•我们设计了一种局部结构保持(LSP)方法来度量教师和学生嵌入的局部拓扑结构的相似性,使我们的方法易于扩展到动态图模型
•我们在不同领域的两个不同任务和不同体系结构的GCN模型上对所提出的方法进行了评估,结果表明,我们的方法始终优于所有其他方法。

Alt
图1:(a)与现有的只关注预测或中间激活的知识提取方法不同,我们的方法明确地提取了关于教师模型如何嵌入拓扑结构并将其转移到学生模型的知识。(b) 我们通过点云数据集上红点与其他点之间的距离来显示特征空间的结构。这里,每个对象都表示为一组3D点。第一行:从教师处获得的结构;中行:使用局部结构保持(LSP)模块训练的学生获得的结构;底层:从未经LSP培训的学生处获得的结构。中排和下排的特征是在经过十个时期的训练后从模型的最后一层获得的。正如我们所看到的,使用LSP训练的模型学习到的结构与教师的结构相似,而没有LSP的模型无法做到这一点。

Alt
图2: 提出的GCNs知识提取方法框架。局部结构保持模块是该方法的核心。给定教师和学生的特征图和图形,我们首先计算每个节点的局部结构分布,然后匹配教师和学生的分布。将通过最小化所有局部结构之间的分布差异来优化学生模型。

2. 相关工作

人们提出了许多方法来从经过训练的模型中提取知识,并将其转换为容量较小的学生模型[2,38,45]。尽管有许多蒸馏策略不仅利用输出[14],而且还关注中间激活[31,47,16],但它们都是为网格数据作为输入的深度卷积网络而设计的。然而,我们的方法侧重于图卷积网络,它处理非网格域中更一般的输入。据我们所知,这是这方面的第一次尝试。在接下来的内容中,我们简要回顾了与我们的方法相关的几个任务。

知识蒸馏: 知识蒸馏(KD)最早在[14]中提出,其目标是将知识从一个典型的大型教师模型中提取到一个较小的模型中,以便学生模型可以保持与教师模型相似的性能。在这种方法中,通过在softmax函数中设置高温,平滑教师的输出,这使得它包含了类之间关系的信息。除了输出,还可以利用中间激活来更好地训练学生网络。FitNet[31]通过添加一个额外的全连接层来传输学生模型的特征,迫使学生学习与教师类似的特征。[47]提出了一种转移注意力而不是特征本身的方法,以获得更好的蒸馏性能。此外,NST[16]提供了一种学习神经元类似激活的方法。在这一领域还有许多其他方法[23,2,38,36,24,4,34,45,5,4],但它们都没有提供适合GCN的解决方案。

知识融合: 知识融合[33,22,32,44]旨在从不同领域的多名教师那里学习学生网络。学生模型被训练为多任务模型,并向所有教师学习。例如,在[43]中,提出了一种知识融合的方法来训练来自异构任务教师(包括场景解析教师、深度估计教师和表面法线估计教师)的学生模型。学生模型将有一个由所有教师知识培训的骨干网络,以及由相应教师知识培训的不同任务的几个负责人。MTZ[13]是一个将多个相关模型压缩为一个模型的框架。通过分层神经元共享机制提取知识。CFL[25]通过学习公共特征空间来提取知识,其中学生模型模仿教师的转换特征来聚合知识。虽然提出了许多这样的方法,但所涉及的模型通常局限于网格域。

图卷积网络: 近年来,图卷积网络[9,6,21,27,10,42]已被证明是非网格数据的强大模型,它通常表示为一组具有特征的节点,以及一个表示节点之间关系的图。第一篇GCN论文[17]表明,GCN可以通过对谱图卷积进行一阶近似来建立。为了使GCN更强大,人们提出了大量的方法。GraphSAGE[12]提供了一种解决方案,通过对邻域进行采样,而不是使用所有邻域,使GCN模型对大型图具有可伸缩性。GAT[35]将注意机制引入GCN,使其能够自动学习每个邻居的权重。[15] 通过自适应采样提高训练效率。在本文中,我们不是设计一个新的GCN,而是关注如何在不同的GCN模型之间有效地传递知识。

3D物体识别: 3D物体识别的一个设置是,给定一组3D点,预测物体的标签[28,30]。基于深度学习的方法[39,11,7,20,29,26]优于之前基于手工特征提取器[1,3]的方法。此外,基于GCN的方法[8,19,37,18,41]可以直接从点集中编码结构信息,成为这条路线上最流行的方向之一。这些方法中的图形通常通过连接k个最近点获得,其中距离在原始空间[18]或学习的特征空间[37]中测量。

3. 方法

在这一部分中,我们首先简要介绍了GCN,然后是基于对GCN基本机制的观察而提出的知识蒸馏方法的动机。然后,我们详细介绍了局部结构保持(LSP)模块,这是我们提出的方法的核心。此外,我们还探讨了LSP模块中使用的距离函数的不同选择。最后,我们给出了将LSP扩展到动态图模型的方案。

3.1 GCN

与传统卷积网络以网格数据为输入,输出高层次特征不同,图卷积网络的输入可以是非网格的,这更为一般。这种非网格输入数据通常表示为一组特征X={x1, x2, …, xn}∈R^F和一个有向/无向图G = ( v , ϵ ) 。例如,在三维物体识别任务中,我们可以将xi设置为三维坐标,ϵ设置为最近邻集。给定输入X和G,图卷积网络的核心运算如下所示:请添加图片描述
其中,hθ是一个成对考虑特征的函数,gφ是一个将特征映射到新空间的函数,A是如何从邻居聚合特征并获得中心节点i的新特征的策略。

函数h、函数g和聚合策略有多种选择。以图形注意力网络[35]为例。它可以表示为
请添加图片描述
其中,函数g被设计为多层感知器,函数h是另一个多层感知器,它将一对节点作为输入并预测它们之间的注意。聚合策略是根据归一化后的注意对邻居的所有特征进行加权求和。

3.2 Motivation

本方法基于图卷积网络的基本原理。如等式1所示,聚合策略(A AA)在嵌入节点特征[21,35]方面起着重要作用,这是在训练过程中学习到的。因此,我们的目标是向学生提供有关教师所学函数的信息。然而,提取准确代表聚合函数的知识并将其传递给学生是一项挑战。我们没有直接提取聚合函数,而是提取这种函数的结果:嵌入的拓扑结构。然后,学生可以通过匹配自身嵌入的结构和教师嵌入的结构来进行指导。我们将在以下章节中展示如何描述拓扑结构信息,并将其提取给学生。

3.3 Local Structure Preserving

对于GCN的中间特征映射,我们可以将其表示为图G={V,ϵ}和一组特征Z={z1,z2,…,zn}∈ R^F,其中n是节点数,F是要素图的维数。局部结构可以总结为一组向量LS={LS1,LS2,…,LSn},LSi∈ R ^d,其中d是局部结构的中心节点i的阶数。向量的每个元素的计算公式为:
请添加图片描述
其中,SIM是一个测量给定节点对相似性的函数,可以定义为两个特征之间的欧氏距离。这里还可以使用许多其他高级功能,我们将在下一节中提供更多详细信息。我们采用指数运算,并对指向局部结构中心的所有节点的值进行规格化。因此,对于每个节点i,我们可以获得其相应的局部结构表示LSi∈Rd 通过应用公式3进行。注意,对于不同的中心节点,它们的局部结构表示可能在不同的维度,这取决于它的局部图。

在知识蒸馏的背景下,我们既有一个教师网络,也有一个学生网络,在那里教师网络是经过训练和固定的。在这两个网络都以相同的图作为输入,但嵌入特征的层次和维数不同的情况下,我们首先提出了一种局部结构保持策略。对于在优化过程中可以更改图的动态图模型,我们将在第3.5节中给出解决方案。

给定中间特征映射,我们可以计算教师网络和学生网络的局部结构向量,这些结构向量被捐赠为LSs和LSt。对于每个中心节点i,学生和教师之间的局部结构的相似性可以计算为:
请添加图片描述
其中采用了Kullback-Leibler散度。

Si越小意味着局部结构的分布越相似。因此,我们计算给定图的所有节点上分布的相似性,并得到局部结构保持损失为:
请添加图片描述
总损失计算如下:
请添加图片描述
其中,y是标签,ps是学生模型的预测,λ是平衡这两种损失的超参数,H表示交叉熵损失函数,这也是许多其他知识提取方法所采用的方法[31、16、47]。

3.4 Kernel Function

等式4中所示的相似性度量函数对特征空间做出了一个强有力的假设,即一对节点之间的相似性与其欧氏距离成正比,而欧氏距离通常不是真值。因此,我们应用核技巧来解决这个问题,核技巧在将向量映射到更高维度并计算相似度时非常有用。

核技巧在传统的统计机器学习方法中得到了广泛的应用。在这种情况下,原始特征向量将通过隐式函数ϕ映射到更高的维度。然后,将特征向量的相似性计算为两个映射向量的内积,即hϕ(zi),ϕ(zj)。通过采用核函数,

我们可以一起计算上述两个步骤,而不需要知道 ϕ的表达式。

内核函数有多种选择。三种最常用的核函数是线性函数(linear)、多项式核函数(Poly)和径向基函数(RBF)核:
请添加图片描述
在本文中,我们采用并比较了这三个核函数以及L2范数。对于多项式核函数,d和c分别设置为2和0。对于RBF,σ设置为1。

3.5 Dynamic Graph

上述方法适用于以固定图为输入的GCN模型,但对动态图模型缺乏灵活性。在动态图模型的建立中,节点的特征和节点之间的连接都可以改变。以DGCNN模型[37]为例,该图最初是根据输入节点/点的3D坐标构建的,一旦获得了节点的新特征,就会进行重建。

动态图的优点在于,它可以在学习的特征空间中表示拓扑关系,而不是总是在初始特征空间中。然而,这种动态图方法会给我们前面提到的局部结构保持模块带来问题。图3左侧是由DGCNN模型生成的中间图的情况。对于每一层,通过查找每个节点的K闭合节点来构造图,其中K是超参数。使用上述方法直接计算局部结构向量是没有意义的,因为分布将来自完全不同的节点顺序。

我们提出了一种策略,通过在教师模型和学生模型中的图中添加虚拟边来处理这种情况。如图3所示,给定教师和学生构建的两个图,它们通常不具有相同的边分布,我们得到边的并集E u•i = {(j, i) : (j, i) ∈ E t|(j, i) ∈ E s}对于每个中心节点i。可以通过将E替换为等式3中的E u来获得类似的局部结构向量。请注意,尽管我们为这两个图添加了虚拟边,但我们仅将它们用于局部结构保持模块。模型仍然使用其原始图来聚合和更新节点的特征。通过考虑这两个图的并集结构,生成的局部结构向量现在涉及具有相同分布的节点,这使得学生网络可以学习老师学习的拓扑关系。

这种策略不仅可以比较不同邻域分布的嵌入局部结构,还可以比较不同邻域大小的嵌入局部结构。这意味着我们可以将知识从K值较大的教师模型提取到K值较小的学生模型。
请添加图片描述
图3: 使用动态图处理模型,在训练过程中可以更新该图。我们首先根据学生模型和教师模型中两个图的并集添加虚拟边来解决这个问题。然后,可以将局部结构保持模块直接应用于新的图。

4. 实验

在这一部分中,我们首先简要介绍比较方法。然后,我们提供了实验步骤,包括我们使用的数据集、我们采用的GCN模型以及每种比较方法的细节。请注意,我们的目标不是在每个数据集或任务中实现最先进的性能,而是将大量信息从教师模型传输到学生模型。这可以通过学生模型的表现来衡量,当涉及同一个教师预先训练的模型时。

我们在不同领域采用了两个数据集,一个是蛋白质-蛋白质相互作用(PPI)[48]数据集,其中图形来自人体组织。这是节点分类常用的数据集[35,12]。另一个数据集是ModelNet40[40],其中包含来自CAD模型的点云,这是用于3D对象分析的常用数据集[28,30,19,37]。

我们还评估了在不同体系结构的GCN模型上提出的知识提取方法。具体来说,对于PPI数据集,采用了以固定图为输入的GAT[35]模型。对于ModelNet40数据集,采用了带有动态图的DGCNN[37]模型。我们在实验中表明,我们提出的方法在各种设置下达到了最先进的蒸馏性能。

4.1 Comparison Methods

由于没有为GCN模型设计知识蒸馏方法,我们实现了三种可直接用于GCN模型的知识蒸馏方法,包括KD方法[14]、FitNet方法[31]和注意转移方法(AT)[47]。神经元选择性转移[16]也是传统卷积网络的知识蒸馏方法之一。我们省略了它,因为它假设学生和教师的特征图的大小应该是相同的,这不是我们为学生和教师模型设置的情况。除了这些方法之外,我们还设置了一个基线方法,即用原始损失训练学生模型。

比较方法总结如下:
•KD方法[14]是从教师网络中提取知识的首次尝试。它利用教师网络生成的一个标签作为额外的监督。这种方法背后的直觉是,柔化标签包含教师网络学习的班级之间的相似信息。由于该方法仅依赖于输出,因此适用于大多数类型的模型
•FITNET方法(31)不仅利用教师模型的输出,还考虑中间特征映射。该方法基于一个假设,即当学生经过良好训练后,教师模型的特征可以从学生的特征中恢复。它引入了一个额外的映射函数,将学生的特征映射到教师的特征,并计算映射特征和教师特征之间的L2•注意转移方法[47]提供了另一种转移注意域知识的方法。在这种方法中,学生模型必须像老师一样专注于相似的空间区域,这是通过在他们的注意力映射之间添加一个L2loss来实现的。在不考虑不同通道的情况下,可以从特征图中获取注意力图,并保持相同的大小。

4.2 Node Classification

在节点分类任务中,我们得到了具有相关特征的输入节点和图。目标是为每个节点生成嵌入的特征,以便可以分离具有不同类的节点。我们采用蛋白质-蛋白质相互作用(PPI)数据集,该数据集包含24个对应于不同人体组织的图形。我们遵循相同的数据集分割协议,其中20个图用于训练,两个图用于验证,另外两个图用于测试。该数据集中每个图的平均节点数为2372,每个节点的平均度数为14。节点的输入特征维数为50,类数为121。
对于这个数据集和任务,我们对教师模型和学生模型都采用GAT模型。由于这是一个多标签任务,每个节点可以属于多个类,因此采用了二进制交叉熵损失。这两个模型的架构如下所示:
在这里插入图片描述
表1:PPI数据集上用于节点分类的教师和学生模型摘要。学生网络比教师更深,但隐藏特征维度较低。

在这里插入图片描述
表2 :PPI数据集上的节点分类结果。此数据集上使用的教师模型是一个具有三个隐藏层的GAT模型。“完全”表示学生模型使用基本真理标签进行训练,而不使用教师模型。

结果显示在表2中。Params表示参数总数;RunTime是一个样本的推断时间,Training是一次迭代的训练时间/GPU内存使用量,在Nvidia 1080Ti GPU中测量。优化器、学习率、重量衰减和训练时间设置为Adam,0.005,0,500。每种方法的所有其他超参数都经过调整,以在验证集上获得最佳结果。具体来说,对于AT方法,注意力由∑ =|Fi|计算;对于我们,核函数设置为RBF,λ设置为100。请注意,损失函数不涉及softmax函数。因此,通过在softmax函数中设置高温而使用的KD方法不适用于此处。

可以看出,我们期望的所有知识蒸馏方法都未能对学生模型产生积极影响,并导致相对于使用原始损失训练的模型的性能下降。我们的方法,由于能够将局部结构信息传递给学生模型,提供了积极的影响,并导致学生模型在所有比较方法中表现最好。

4.3 3D对象识别

我们采用ModelNet40[40]数据集进行3D对象识别任务,其中对象由一组点表示,仅以3D坐标作为特征。这个数据集中有40个类,每个类中的对象都来自CAD模型。

在本实验中,教师和学生模型的结构与DGCNN相同[37]。DCGNN是一种动态图卷积模型,它既发挥了点网[28]的优势,又发挥了图卷积网络的优势。这里的图是根据点在其特征空间中的距离构建的。由于特征空间在不同的层次和不同的训练阶段是不同的,因此图也发生了变化,使其成为一个动态图卷积模型。

教师模型的设置与原论文相同:它有五个图形卷积层,后面是两个全连接的层。学生模型有四个图卷积层,特征映射通道更少,后面是一个全连接的层。学生模型中使用的图的大小(由构建图时的邻域数(K)决定)也小于教师的。这两个模型的详细信息总结在表3。
在这里插入图片描述
表3:ModelNet40数据集上使用的教师和学生模型摘要。学生网络具有更少的层、更少的通道和更小的输入图。

结果显示在表4中。对于KD方法,α设置为0.1,与原论文相同。优化器、学习率、动量和训练轮数设置为SGD,0.1,0.9,250。每种方法的其他超参数都会转换,以在验证集上获得最佳精度。对于我们的方法,核函数设置为RBF,λ λλ设置为100。
在这里插入图片描述
表4:ModelNet40上的3D对象识别结果。这里使用的教师网络是一个具有四个图卷积层的DGCNN模型。

4.4 结构可视化

为了直观地理解所提出的方法,我们在优化过程中可视化学习到的特征空间的结构,该结构由对象中点之间的距离表示。如图4所示,使用所提出的方法训练的学生模型(显示在每个对象的下一行)可以在早期训练阶段非常快速地学习与教师模型类似的结构。这可以部分解释为什么提出的方法可以生成更好的学生模型。

在这里插入图片描述
图4: 通过红点与其他点之间的距离来描述所学特征空间结构的可视化。从模型的最后一层提取特征。从左到右,我们显示了在历元1、5、10、20、50和100中训练的模型的结构。最右边的列从教师模型中获得。对于每个对象,下一行是通过我们提出的方法训练的学生模型获得的,上一行是通过交叉熵损失训练的学生模型获得的。我们提出的知识提取方法引导学生模型像教师模型一样嵌入局部结构,从而在早期训练阶段形成类似的结构。

4.5 消融和性能研究

为了全面评估我们的方法,我们在这里提供了一个详细和性能研究,包括不同内核函数的影响,以及不同StudentModel配置的性能。本节的所有实验均在ModelNet40数据集上进行。

不同的核函数。我们测试了三种不同的核函数,如等式8和naiveL2Norm。结果显示在表5。所有函数都能提供正面信息,以获得更好的学生模型,RBF效果最好。
在这里插入图片描述
表5: 不同内核函数的性能。RBF实现了总体最佳性能。

不同的型号配置。我们在这里提供了实验来评估使用我们提出的方法进行训练时模型复杂性和性能之间的权衡。具体地说,我们通过向每一层添加更多通道、再添加一个图卷积层和再添加一个全连接的层来更改学生模型。请注意,具有更多通道的学生模型与教师模型具有几乎相同的精度性能,但参数较少。
在这里插入图片描述
表6: 不同模型配置的性能,以评估性能与模型大小/运行时之间的权衡。

5. 总结

在本文中,我们提出了一种从GCN中提取知识的专用方法,据我们所知,这是沿着这条路线进行的第一次尝试。这是通过在培训过程中保留教师网络的本地结构来实现的。我们将中间特征映射的局部结构表示为局部结构中心节点与其相邻节点之间相似度的分布,因此保持局部结构等同于匹配分布。此外,该方法可以很容易地扩展到动态图模型。在不同领域的两个数据集和不同体系结构的两个GCN模型上的实验表明,该方法具有最先进的提取性能,优于现有的知识提取方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络中的知识进行提取,是一种将模型的信息转化为更为简洁和易于理解形式的过程。 神经网络是一种由许多神经元组成的复杂计算模型,它们通过学习和调整权重来解决各种问题。然而,神经网络通常具有大量的参数和复杂的结构,这使得它们难以解释和应用到其他领域。因此,我们需要一种方法来提取和总结神经网络中的知识,以便更好地理解和应用这些模型。 在进行神经网络知识提取时,有几种常见的方法。一种常见的方法是使用可视化技术,如热力图、激活图和网络结构图等,来可视化网络中不同层的活动模式。这些可视化技术能够帮助我们发现网络中的模式和特征,并从中推断出网络的知识。 另一种方法是使用特征提取技术,如卷积神经网络(CNN)的滤波器、自动编码器的隐藏层和循环神经网络(RNN)的隐状态等,来提取网络学习到的重要特征。这些重要特征可以帮助我们更好地理解网络学习到的信息,并将其应用到其他问题中。 此外,还有一种被称为知识蒸馏的技术,它通过训练一个较小的模型来提取大型模型中的知识。知识蒸馏通过引入目标函数和额外的训练策略,使小模型能够学习到大模型中的重要知识,并在不损失太多性能的情况下将其应用到实际问题中。 总而言之,提取神经网络中的知识是一项重要任务,它能够帮助我们更好地理解和应用这些复杂的模型。通过可视化、特征提取和知识蒸馏等方法,我们能够从神经网络中提取出有用的信息,并将其应用到其他领域或解决其他问题中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值