论文解读:DeepBDC小样本图像分类

Joint Distribution Matters: Deep Brownian Distance Covariance for Few-Shot Classification

摘要

由于每个新任务只给出很少的训练样例,所以few -shot分类是一个具有挑战性的问题。解决这一挑战的有效研究路线之一是专注于学习由查询图像和某些类别的少数支持图像之间的相似性度量驱动的深度表示。统计上,这相当于测量图像特征的依赖性,被视为高维嵌入空间中的随机向量。以往的方法要么只使用边际分布而不考虑联合分布,表示能力有限,要么利用联合分布计算量大。本文提出了一种基于深度布朗距离协方差(DeepBDC)的小样本分类方法。DeepBDC的核心思想是通过测量嵌入特征的联合特征函数与边缘积之间的差异来学习图像表示。由于BDC度量是解耦的,我们将其表述为一个高度模块化和高效的层。此外,我们在两种不同的少量分类框架中实例化了DeepBDC。我们在六个标准的少拍图像基准上进行了实验,涵盖了一般目标识别、细粒度分类和跨域分类。广泛的评估表明,我们的DeepBDC显著优于同行,同时建立了新的最先进的结果。源代码可从http://www.peihuali.org/DeepBDC获得。

介绍

Few-shot分类[15,17]关注的是一项任务,其中分类器可以适应于区分以前未见过的类别,仅给定这些类别的非常有限数量的示例。这是一个具有挑战性的问题,因为几乎没有标记的例子远远不足以学习丰富的知识,还可能导致过拟合。一个实用的解决方案是基于元学习或学习如何学习[12,39]技术,其中情景训练是为了将在跨越大量已知类的大量元训练集上获得的知识转移到新类的少数镜头政权。在已经取得的巨大进展中,基于度量的方法引起了相当大的研究兴趣[15,26,33,39],近年来取得了最先进的性能[45,47]。

基于度量的few-shot分类的主要思想是通过深度网络学习表征,由查询图像与某些类别的少数支持图像之间的相似性度量驱动[33,47]。统计上,查询图像的特征(支持图像)可以看作是一个随机向量X(Y)的观测值。在高维嵌入空间中。因此,图像之间的相似性可以通过概率分布来度量。然而,对高维(通常很少)特征的分布进行建模是困难的,常用的方法是对统计矩进行建模。ProtoNet[33]及其变体(例如,[26])通过一阶矩(平均向量)表示图像,并使用欧几里得距离或余弦相似度进行度量学习。为了获取更丰富的统计数据,一些作品研究了第二矩(协方差矩阵)[44]或一矩和第二矩的组合以高斯形式[20]进行图像表示,同时采用Frobenius范数或kullbackleiberler (KL)散度作为相似性度量。然而,这些方法只利用了边际分布而忽略了联合分布,限制了学习模型的性能。此外,协方差只能模拟线性关系。

一般来说,X和Y之间的依赖关系应该根据它们的联合分布f_{XY}(x,y)[6]。动土距离(EMD)是测量这种相关性的有效方法。如[29,2.3节]所述,EMD寻求最优联合分布f_{XY}(x,y),其边际被限定为给定f_{X}(x),f_{y}(y),使得运输成本的期望最小。在少镜头分类中,DeepEMD[47]提出差分EMD来实现图像区域的最优匹配。虽然达到了最先进的性能,但由于固有的线性算法,DeepEMD的计算成本很高[45][c]。互信息(MI)[3,28]是一个众所周知的度量,它可以通过两个随机变量的联合分布和边际积之间的kl -散度来量化两个随机变量的相关性。不幸的是,MI的计算在实值、高维设置中是困难的[2],并且通常涉及困难的密度建模或kl -散度的下界估计[14]。

本文提出了一种基于深度布朗距离协方差(DeepBDC)的小样本分类方法。在[35,36]中首次提出的BDC度量被定义为联合特征函数与边际积之间的欧几里得距离。它可以自然地量化两个随机变量之间的依赖关系。对于离散观测(特征),BDC度量是解耦的,因此我们可以将BDC表述为池化层,可以无缝地插入到深度网络中,接受特征映射作为输入,并输出BDC矩阵作为图像表示。这样,两幅图像之间的相似度被计算为对应的两个BDC矩阵之间的内积。因此,我们的DeepBDC的核心是高度模块化和即插即用的不同方法的少样本图像分类。具体来说,我们在元学习框架(Meta DeepBDC)和依赖非情景训练的简单迁移学习框架(STL DeepBDC)中实例化了我们的DeepBDC。与协方差矩阵相反,我们的DeepBDC可以自由地处理非线性关系并充分表征独立性。与EMD相比,它还考虑了联合分布,最重要的是,它可以有效地进行解析计算。与MI不同,BDC不需要密度建模。我们在表1中列出了我们的BDC与同行之间的差异。

表1。我们的DeepBDC与同类产品的比较。为了量化随机向量X和Y之的依赖关系,基于矩量的方法[20,33,44]只能模拟边缘分布,表示能力有限;虽然通过考虑联合分布实现了最先进的性能,但DeepEMD[47]在计算上是昂贵的。我们的DeepBDC测量联合特征函数与边际积之间的差异,可以有效地以封闭形式计算,并且可以模拟非线性关系并充分表征独立性。注意,对于一个随机向量,它的特征函数和概率分布是等价的,因为它们形成了傅里叶变换对。本文报告了miniImageNet上5-way 1-shot=5-shot分类的准确性;我们的结果是由Meta DeepBDC获得的,对应的结果是从各自的论文中复制的。

我们的贡献总结如下。

(1)首次将布朗距离协方差(brown distance covariance, BDC)这一基础但被忽视的依赖建模方法引入到基于深度网络的少样本分类中。我们的工作表明了BDC在深度学习中的巨大潜力和未来的应用。

(2)我们将DeepBDC制定为一个高度模块化和高效的层,适用于不同的few-shot学习框架。此外,我们提出了两种基于少镜头分类的实例,即以ProtoNet为蓝图的基于元学习框架的Meta DeepBDC和基于简单迁移学习框架而不进行情景训练的STL DeepBDC。

(3)我们对我们的方法进行了彻底的消融研究,并在6个少弹分类基准上进行了广泛的实验。实验结果表明,我们的两个实例都取得了优异的性能,同时也创造了新的技术水平。

相关的工作

小样本分类中的表示学习

在标记样本有限的情况下,图像表示和相似度度量在小样本分类中起着重要作用。

根据图像的表示方式,我们可以将少镜头分类方法大致分为两类。在第一类中,图像表示是基于分布建模的。他们使用一阶矩(平均向量)[33]、第二阶矩(协方差矩阵)[44]、高斯分布[20]或离散概率[47],并因此采用欧氏距离(或余弦相似度)、Frobenious范数、kl -散度或地球移动者距离作为不相似度度量。第二类涉及查询图像和支持图像之间的特征重建,通过Ridge回归[45]或注意机制[9,46]直接进行线性重建,或者设计关系模块来学习可转移的深度度量[34,48]。

我们的方法属于第一类,与现有作品最大的区别在于我们使用布朗距离协方差进行少镜头状态下的表示学习。

元学习与简单迁移学习

元学习实际上是一种少样本分类的框架[12,39]。它涉及一系列任务(情节),这些任务被分成互不关联的元训练集和元测试集。通常,每个任务被表述为一个N-way K-shot分类,它跨越N个类,每个类提供K个支持图像和一些查询图像。元训练集和元测试集共享情景训练策略,促进跨任务的泛化能力。大多数方法,无论是基于优化的[12,30]还是基于度量的[33,34],都遵循这种方法。许多研究[5,45,47]表明,与从头开始进行元训练相比,对整个元训练集进行预训练对元学习更有帮助。最近有研究发现,完全不依赖情景训练的简单迁移学习(STL)框架取得了非常有竞争力的表现[4,8,37]。对于STL方法,在元训练过程中,通过跨所有类的整个元训练集上的标准交叉熵损失来训练深度网络以解决常见的分类问题;在元测试过程中,将训练好的模型作为特征提取的嵌入模型,然后构建一个线性模型,如soft-max分类器[4,8]或逻辑回归模型[37],并对其进行训练以进行少镜头分类。

最后,我们提到很少有作品将BDC用于机器学习或计算机视觉,目前我们发现了一种基于BDC的降维方法[7],与深度学习无关。

3推出的方法

在本节中,我们首先介绍布朗距离协方差(BDC)。然后我们在卷积网络中表述我们的DeepBDC。最后,我们实例化了我们的DeepBDC用于少量图像分类。

3.1. 布朗距离协方差(BDC)

BDC理论最早是在[35,36]中根据特征函数建立的。随机向量的特征函数等价于它的概率密度函数(PDF),因为它们形成了傅里叶变换对。

X\in R^{p},Y\in R^{q}分别是p维和q维的随机向量,设f_{XY}(x,y)成为他们的联合概率密度函数PDF。0X和Y的联合特征函数定义为(公式2)

\phi_{XY}(t,s)=\int_{R^p}\int_{R^q}{exp(i(t^Tx+s^Ty))f_{XY}(x,y)dxdy}

其中i是虚单位。显然,X和Y的边际分布分别为\phi_{X}(t)=\phi_{XY}(t,0),\phi_{Y}(s)=\phi_{XY}(0,s)

,其中0是一个向量,其元素全为的零。根据概率论,我们知道X和Y是独立的当且仅当
\phi_{XY}(t,s)=\phi_{X}(t) \phi_{Y}(s)。假设X和Y具有有限的一阶矩,则定义BDC度规为

\rho(X,Y)=\int_{R^p}\int_{R^q} \frac {|\phi_{XY}(t,s)-\phi_{X}(t) \phi_{Y}(s)|^{2}} {c_{p}c_{q}||t||^{1+p}||s||^{1+q}} dtds

式中||.||为欧氏范数,c_{p}=\pi^{(1+p)/2}/\Gamma((1+p)/2) ,Γ为完全函数,即\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt

对于m个观测值的集合\{(x_{1},y_{1}),...,(x_{m},y_{m})\}是独立同分布,,一个自然的方法是根据经验特征函数来定义BDC度量:

虽然公式2看起来很复杂,但BDC度量对于离散观测值具有封闭形式表达式。设\hat{A}=(\hat{a_{kl}})\in{ R^{m\times m}}

其中\hat{a_{kl}}=||x_{k}-x_{l}||是在x的观测对之间计算的欧几里得距离矩阵。类似地,我们计算欧几里得距离矩阵\hat{B}=(\hat{b_{kl}})\in R^{m\times m}其中\hat{b_{kl}}=||y_{k}-y_{l}||。那么BDC指标有如下形式[35]1(公式4):\rho(X,Y)=tr(A^T B)

事实上,\rho(X,Y)=\frac{1}{m^2}tr(A^T B),常数\frac{1}{m^2}被同化为可学习的缩放参数τ(见第3.3节),因此被省略。

式中tr(·)为矩阵迹,T为矩阵转置,A=(a_{kl})称为BDC矩阵。这里,

a_{kl}=\hat{a}_{kl} -\frac{1}{m}\sum_{k=1}^{m}\hat{a}_{kl} -\frac{1}{m}\sum_{l=1}^{m}\hat{a}_{kl} -\frac{1}{m^2}\sum_{k=1}^{m}\sum_{l=1}^{m}\hat{a}_{kl}

其中后三项分别表示\hat{A}的第l列,第k行和所有项的均值。矩阵B可以用类似的方法从\hat{B}中计算出来。由于BDC矩阵是对称的,\rho(X,Y)也可以写成两个BDC向量a和b的内积,即(公式5):

\rho(X,Y)=<a,b>=a^Tb

其中a(b)是通过提取A的上三角部分得到的(B),然后进行矢量化。

度规\rho(X,Y)有一些可取的性质。

(1)它是非负的,当且仅当X和Y独立时等于0。

(2)它可以表征X和Y之间的线性和非线性依赖关系。

(3)它对X和Y的个别平移和正交变换是不变的,对它们的个别比例因子是等变的。

也就是说,对于任意向量c_{1}\in R^p,c_2\in R^q,标量s_1,s_2和标准正交矩阵

R_2\in R^{p\times q},R_2\in R^{p\times q},\rho(c_1+S_1R_1X,c_2+s_2R_2Y)=|s_1s_2|\rho(X,Y)

3.2. 作为池化层的DeepBDC的表述

根据Eq.(4)和Eq.(5),我们可以看到BDC度量是解耦的,因为我们可以独立计算每个输入图像的BDC矩阵。具体来说,我们设计了一个适合于卷积网络的两层模块,分别进行了降维和BDC矩阵的计算。由于BDC矩阵的大小相对于网络中通道(特征映射)的数量呈二次增长,我们在网络主干网的最后一个卷积层之后插入一个1×1卷积层用于降维。

假设网络(包括降维层)参数化为θ,该θ将彩色图像z\in R^3嵌入到特征空间中。图像的嵌入是一个
h\times w \times d张量,其中hw为空间高度和宽度,d为通道数。我们将张量重塑为矩阵X\in R^{hw\times d},并且可以将每列x_k\in R^{hw}或每行(转置后)x_j\in R^{d}

视为随机向量X的观察值。我们提到,在实践中,对于任何一种情况,i.i.d.假设都可能不成立,并且在第4.2节中给出了两种选择的比较。

在下面的例子中,我们取x_k作为随机观察值。我们发展了三个算子,分别计算了平方欧几里得距离矩阵\tilde{A}=(\~a_{kl})(其中\tilde{a}_{kl}是X的第k列和第l列之间的平方欧几里得距离矩阵)、
\tilde{A}=(\sqrt{\~a_{kl}})和BDC矩阵A(由\hat A减去它的行均值、列均值和所有元素的均值)。也就是说,

这里1\in R^{d\times d}是一个矩阵,每个元素都是1,I是单位矩阵,◦表示阿达玛乘积。我们记
(U)sym=\frac{1}{2}(U+U^T)接下来,我们用A_\Theta(z)表示BDC矩阵是从用θ参数化的带有输入图像z的网络中计算出来的。

def BDCovpool(x, t):
    batchSize, dim, h, w = x.data.shape
    M = h * w
    x = x.reshape(batchSize, dim, M)

    I = torch.eye(dim, dim, device=x.device).view(1, dim, dim).repeat(batchSize, 1, 1).type(x.dtype)
    I_M = torch.ones(batchSize, dim, dim, device=x.device).type(x.dtype)
    x_pow2 = x.bmm(x.transpose(1, 2))
    dcov = I_M.bmm(x_pow2 * I) + (x_pow2 * I).bmm(I_M) - 2 * x_pow2
    
    dcov = torch.clamp(dcov, min=0.0)
    dcov = torch.exp(t)* dcov
    dcov = torch.sqrt(dcov + 1e-5)
    t = dcov - 1. / dim * dcov.bmm(I_M) - 1. / dim * I_M.bmm(dcov) + 1. / (dim * dim) * I_M.bmm(dcov).bmm(I_M)

    return t

因此,我们将DeepBDC定义为无参数的空间池化层。它是高度模块化的,适用于不同的网络体系结构和不同的框架的少射分类。BDC矩阵主要涉及标准矩阵运算,适合在GPU上并行计算。从Eq.(6)可以清楚地看出,BDC矩阵通过欧几里得距离来模拟通道之间的非线性关系。协方差矩阵可以类似地解释,但是,它通过内积对通道之间的线性关系进行建模[49,第4.1节]。理论上,它们有很大的不同,因为BDC矩阵考虑联合分布,而协方差矩阵只考虑边缘分布。

3.3. 实例化DeepBDC进行少样本学习

我们基于元学习框架和简单迁移学习框架实例化了我们的DeepBDC,得到的Meta DeepBDC和STL DeepBDC分别如图1a和图1b所示。

Meta DeepBDC

标准的几次学习是在大量任务中以一种情景式的方式进行的。任务通常被表述为N-way K-shot分类问题,它指N个类,每个类有K个支持图像和Q个查询图像,在支持集D^{sup}=\{(z_j,y_j)\}^{NK}_{j=1},查询集D^{que}=\{(z_j,y_j)\}^{NQ}_{j=1}。学习器在D^{sup}上进行训练,并在D^{que}上进行预测。

我们用ProtoNet[33]作为蓝图实例化Meta DeepBDC。它学习分类所在的度量空间,通过计算到每个类原型的距离来执行。在一个任务上(D^{sup},D^{que}),我们将图像z_j馈送到网络以产生BDC矩阵
A_{\theta}(z_j)。支持类k的原型是属于其类的BDC矩阵的平均值(Avg):

其中S_kD^{sup}中标记为k类的样本集。

基于到支持类原型的距离的softmax,我们生成了类间的分布,然后制定了以下损失函数:

其中\tau是一个可学习的尺度参数[5,45,46]。

我们通过从大量的元训练集C训练中采样任务来训练学习器,其中类的数量远远大于n。然后,我们从一个固定的元测试集C测试中采样任务,我们评估学习器的性能。情景训练确保了元训练和元测试之间的一致性,这对元学习方法至关重要[33,39]。

STL DeepBDC(略)

该实例化基于广泛使用的简单迁移学习(STL)框架[10],其中深度网络在大型数据集上进行训练,然后用作嵌入模型,以提取具有少量标记示例的下游任务的特征。

3.4. 与以往方法的关系

\{x_j\}^n_{j=1}查询图像的特征,作为随机向量X的观测值。可以计算均值u_X=\frac{1}{n}\sum_{j=1}^n{x_j},协方差矩阵\Sigma_X=\frac{1}{n}\sum_{j=1}^n(x_j-u_X)(x_j-u_X)^T或高斯分布N_{u_x},\Sigma_X作为图像表示。值得注意的是,这些表征在少数次学习机制之外得到了广泛的研究,其中它们分别被认为是全局平均池化[13]、双线性[22]或协方差池化[42]和高斯池化[41]。相应的支持类原型,u_Y,\Sigma_YN_{u_Y,\Sigma_Y}

,可以使用K个支持图像的特征来计算。

ProtoNet[33]

ProtoNet[33]用均值向量表示图像,用欧几里得距离\rho_{Protonet}(X,Y)=||u_{X}-u_{Y}||^2或余弦相似度u^T_Xu_Y/(||u_X|||u_Y||)用于度量学习。

CovNet[44]

CovNet[44]采用协方差矩阵作为图像表示来改进一阶表示。

将协方差矩阵进行有符号平方根归一化,然后与矩阵空间中的欧几里得距离(即Frobenius范数)

\rho CovNet(X,Y)=||\Sigma_X-\Sigma_Y||^2

ADM[20]

ADM[20]提出使用非对称分布度量(ADM)来评估查询图像与支持类之间的不相似度。图像的分布由多元高斯分布表示,其差异由KL-divergence\rho_{ADM}(X,Y)=D_{KL}(N_{u_x,\Sigma_X}||N_{u_Y,\Sigma_Y})

DeepEMD[47]

DeepEMD[47]使用离散分布作为图像表示。具体来说,查询图像的离散PDF(Probability Distribution Function:概率分布函数)为f_X(x)=\sum_{j=1}^{n}f_{x_j}\delta_{X,X_j},其中f_{x_j}表示x_j的概率;
\delta_{X,X_j}为Kronecker delta,当x=x_j时等于1,否则为零。

设支持图像的PDF为f_Y(y)=\sum_{j=1}^{n}f_{y_j}\delta_{y,y_j}

f_X(x)f_Y(y)之间的距离表示为EMD,即
\rho_{EMD}(X,Y)=min_{f_{x_j,y_l}\ge0}\sum^n_{j=1}\sum^n_{l=1}{f_{x_j,y_l}c_{x_j,y_l}}

,有约束\sum^n_{l=1}{f_{x_j,y_l}}=f_{x_j}\sum^n_{j=1}{f_{x_j,y_l}}=f_{y_l},j,l=1,...,n 。在这里c_{x_j,y_l}这是运输费。

因此,EMD寻求最优联合分布f_{XY}(x_j,y_l)使得运输成本的期望最小[29,第2.3节]。DeepEMD提出了一个交叉参考机制来定义f_{x_j}f_{y_l},并提出了一个结构化的FC层来处理K-shot分类(K>1)。

4. 实验

数据集

我们在两个通用目标识别基准上进行实验,即miniImageNet[39]和tieredImageNet[31],以及一个细粒度图像分类数据集,即CUB-200-2011[40](简称CUB)。我们还通过在miniImageNet上训练来评估模型的领域转移能力,然后在CUB[40]、Aircraft[24]和Cars[16]上进行测试。

Backbone network

为了与之前的方法进行公平比较,我们使用两种网络作为骨干网,即ResNet-12[18,37]和ResNet-18[1,23,34]。与常用做法相同,ResNet-12和ResNet-18的图像输入分辨率分别为84×84和224×224。此外,我们采用更深层次、容量更高的模型,即输入图像为224×224的ResNet-34[13]和输入图像为84×84的ResNet-34变体。

与[9,20]类似,我们删除了主干的最后一次降采样,以获得更多的卷积特征。

训练

我们的Meta DeepBDC基于元学习框架,依赖于情景训练。每个情节(任务)涉及标准的5-way 1-shot或5-way 5-shot分类,从元训练或元测试集中统一采样;之后[5,45,47],在情景训练之前,我们对初始化权重的模型进行预训练。

与Meta DeepBDC相反,我们的STL DeepBDC基于简单的迁移学习框架,需要非情景训练。接下来[37],我们训练一个网络作为一个嵌入模型,在整个跨所有类的元训练集上具有交叉熵损失;对于每个元测试任务,我们使用嵌入模型提取的特征训练一个新的逻辑回归分类器。

在补充(Supp.) S1中,我们提供了数据集的统计数据和元训练/验证/测试集的分割,以及网络架构,优化器,超参数等细节。

4.2. 消融实验

我们对我们的两个实例进行消融分析,并与以ResNet-12为骨干的miniImageNet上的5路任务进行比较。附录S-2和附录S-3分别给出了相应版本和额外实验的实施细节。

Meta DeepBDC的消融分析

由于BDC矩阵的大小在通道数量上是二次的,我们引入了1×1卷积(conv)层,将通道数量减少到d。在我们的实现中,每个BDC矩阵都像Eq.(5)一样矢量化,因此大小为d(d+1)=2。表2a(上)显示了不同的d对准确率和每集元测试时间的影响。我们可以看到,当d= 640时达到最高精度;同时,元测试时间仅随d的增大而适度增加。我们还尝试直接将BDC模块连接到主干,而不需要额外的1×1转换层;我们获得了67.10±0.43和84.50±0.28的1-shot和5-shot的效果,与使用额外的1×1转换层获得的最佳结果相当。除了Eq.(5)所示的内积外,我们还可以使用欧氏距离或余弦相似度作为度量,相应的结果如表2a(下)所示。

距离达到最高精度为5-shot。在这里获得的最佳设置将在其余纸张中使用。最后,我们注意到,无论d的值如何,Meta DeepBDC的性能都比基线(即ProtoNet)好得多,而延迟的增加很小。

4.3. 与最先进方法的比较

总结

本文提出了一种基于深度布朗距离协方差(DeepBDC)的小样本分类方法。

对于查询和支持图像,DeepBDC可以通过测量其嵌入特征的联合分布与边缘积的差异来有效地学习图像表示。DeepBDC的核心是一个模块化的高效层,可以灵活地插入到深度网络中,既适用于基于情景训练的元学习框架,也适用于依赖非情景训练的简单迁移学习框架。大量的实验表明,我们的DeepBDC方法比同类方法表现得更好,并且在多个一般、细粒度和跨域的小样本分类任务上设置了新的最先进的结果。我们的工作显示了BDC这一基本但被忽视的技术的巨大潜力,并鼓励其未来在深度学习中的应用。

自己的实验

window下注意将datamgr.py,dataset.py的num_workers全设置为0

这篇文章其中一个亮点是对设备要求不高,用的是 GeForce GTX 1080.

论文下载(2022CVPR 口头演讲)

https://arxiv.org/abs/2204.04567

📎Joint Distribution Matters Deep Brownian Distance Covariance for.pdf

代码地址

GitHub - Fei-Long121/DeepBDC: The Pytorch code of "Joint Distribution Matters: Deep Brownian Distance Covariance for Few-Shot Classification", CVPR 2022 (Oral).

参考文章

CVPR 2022 Oral | 大连理工提出小样本识别DeepBDC,6项基准性能最好-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十有久诚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值