【组会论文记录】2021/3/24(CReST、SELF、SelNLPL、Class-Balanced Loss、Solve PDE with DNN)


0. 补充

0.1 类别不均衡问题

  • 文章1和文章2都涉及类别不均衡问题,特此补充

  • 类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况。如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。例如有998个反例,但是正例只有2个,那么学习方法只需要返回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度;然而这样的学习器往往没有价值,因为它不能预测出任何正例。

  • 网上的开源数据集大都经过处理,保证各类样本基本均匀,但当我们自己收集数据时,由于数据获取成本的差异,收集的数据往往服从不均匀的长尾分布。比如我们现在要收集一个猫科动物数据集,我们可以轻易收集上万张猫咪图片,但是罕见猫科动物(比如猞猁等)的图片可能只收集到数百张,如果不进行处理,就会遇到严重的类别不均衡问题
    在这里插入图片描述

  • 直接使用类别不均匀的数据集进行训练,会导致多数类过拟合,少数类欠拟合

  • 一般有三种方式解决类别不均衡问题

    1. 欠采样:丢掉一些多数类样本,使得样本数量均衡。由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,不过这一问题可以用集成学习解决
    2. 过采样:增加一些少数类样本,使得样本数量均衡。增加少数类样本的方式有直接复制、数据增强、样本间插值等方法
    3. 代价敏感方法:所谓代价敏感,就是指犯不同类型错误所造成的损失不同。可以从模型、后处理、前处理三个角度引入非均等代价。其中在前处理引入的手段是在计算损失函数时,对于不同类型数据的损失使用不同的权重,线性加权得到最终损失

    前两种方法统称 “重采样”(re-sampling),第三种方法称为 “重加权”(re-weighting)

1. 文章1:Class-Balanced Loss

  • 【CVPR2019】【类别不均衡问题】【全监督】:Class-Balanced Loss Based on Effective Number of Samples
  • 核心idea:在类别不平衡的全监督学习任务中,可以使用对不同类损失重加权的方法缓解类别不均匀问题。在对各类损失重加权时,通常直接使用样本数量的倒数作为权重,但这种权重选取并不是最优的。本文通过提出 “有效样本数” 的概念,从理论上给出了最优损失权重的近似解析形式

1.1 abstract

  • 随着大规模真实世界数据集的迅速增加,解决长尾数据分布的问题变得至关重要。 现有的解决方案通常采用类别重新平衡策略,例如根据每个类别的样本数进行重采样或重加权。 在这项工作中,我们认为随着样本数量的增加,新添加样本带来的额外好处将减少。本文介绍了一种新颖的理论框架,通过样本看作一个小区域(small neighboring region)来测量数据重叠。 “有效样本数” 定义为样本的体积,可以通过简单公式 1 − β n 1 − β \frac{1-\beta n}{1-\beta} 1β1βn 来计算,其中 n n n 是样本数, β ∈ [ 0 , 1 ) β∈[0,1) β[01)是超参数 。我们设计了一种重加权方案,使用每个类的有效样本数来平衡损失,得到 Class-Balanced Loss 。在人工诱导的长尾CIFAR数据集、包含ImageNet及iNaturalist的大规模数据集上的全面试验表明,在使用 Class-Balanced Loss 进行训练时,使用长尾数据集的网络可以实现显着的性能提升。

1.2 有效样本数(Effective Number of Samples)

  • 这是本文提出的一个核心概念,它的意思大概是说:每一个类都有其固定的 “体积” ,这个体积是由此类特征空间中所有可能的数据共同决定的。举例来说,猫这个类别包括狸花猫、布偶猫、缅因猫、大猫、小猫、白猫、黑猫等等,世界上所有猫咪图片界定了 “这是一张猫的图片” 这个概念,可以把 “体积” 理解为信息量,每一张特定的猫咪图片都有一定的体积,因为它给出了猫这个概念的部分信息。
  • 如果把样本理解为其包含信息量的体积,显然样本是可以重合的。两张狸花猫图片包含的关于 “什么是猫” 这个概念的信息其实差不多,我们可以认为这两个样本重合得很多,而一张狸花猫图片和一张无毛猫图片重合得就比较少。因此,随着样本数量的增加,新样本提供的新信息逐渐减少(额外好处将减少)。
  • 文章定义一个样本的 “体积” 为1;定义 “(类的)有效样本数”,为任意两个样本完全不重合的情况下,完全覆盖类 “体积” 所需的样本数量。显然n个样本的体积(这n个样本组成集合的有效样本数)是小于等于n的,因此在损失加权时直接使用样本数量的倒数是不合适的。
  • 设类 S \mathcal{S} S 的有效样本数为 N N N n n n 个样本集合的有效样本数为 E n E_n En我们忽略样本部分重合的情况,则对于第n个样本,设其完全被被前n-1个样本组成的集合覆盖的概率为 p,即
    在这里插入图片描述
  • 使用数学归纳法可以证明:
    { E n = 1 − β n 1 − β β = N − 1 N \left\{ \begin{aligned} E_n & = \frac{1-\beta^n}{1-\beta} \\ \beta &= \frac{N-1}{N} \end{aligned} \right. Enβ=1β1βn=NN1
  • 分析 E n E_n En 的渐进性
    { N = 1 , β = 0 ⇒ E n = 1 N → ∞ , β → 1 ⇒ E n → n \left\{ \begin{aligned} N &= 1, &\beta = 0 &\Rightarrow E_n = 1\\ N &\to \infin, & \beta \to 1 & \Rightarrow E_n \to n \end{aligned} \right. {NN=1,,β=0β1En=1Enn
    可见,当类体积 N N N 趋向无限大时,近似认为任意两个样本都不重合,这时前n个样本的有效样本数等于真实样本数n;当类体积为最小值1时,我们认为整个类的信息量用一个样本就可以完全表示了,前n个样本的有效样本数也只有1

1.3 类别平衡损失(Class-Balanced Loss)

  • 明确有效样本数的概念后,文章提出在对不同类损失加权时,权重应选择有效样本数的倒数,这样调整后的损失称为类别平衡损失 (CB),即
    C B ( p , y ) = 1 E n y L ( p , y ) = 1 − β 1 − β n y L ( p , y ) CB(p,y) = \frac{1}{E_{n_y}}\mathcal{L}(p,y) = \frac{1-\beta}{1-\beta^{n_y}}\mathcal{L}(p,y) CB(p,y)=Eny1L(p,y)=1βny1βL(p,y)
    这里 n y n_y ny 是真实级别 y y y 中的样本数。损失 L ( p , y ) \mathcal{L}(p,y) L(p,y) 可以是任意损失

  • BC中的权重是关于 β \beta β 的函数,如下图所示
    在这里插入图片描述
    这里x轴代表此类的真实样本数,y轴代表此类损失的BC权重。可见 β = 0 \beta=0 β=0 对应于没有重新加权,而 β → 1 β→1 β1 对应于按类频率倒数(类样本数的倒数)加权。 本文提出的有效样本数的新概念使我们能够使用超参数 β \beta β 在这两种方式间任意选择权重曲线

  • 以上是本文的核心idea,后面就是对多种损失函数,调整超参数 β \beta β 进行实验,发现效果有提升。

1.4 小结

  • 这篇文章理论提出的 “有效样本数” 概念是好的,从信息量角度思考确实有道理,给出的 E n E_n En 解析形式也有比较好的渐进性。但是因为不能明确定义样本体积(信息量),无法准确计算其重合,推导 E n E_n En 时作者忽略了部分重合的情况,最后的解析形式准确性不一定好。另外类体积 N N N 也是无法计算的,导致 β \beta β 只能作为一个超参数,使用时还需要进行调优。
  • 从实验的角度看,这篇文章实际上就是在 “不做损失加权” 和 “按类样本数量(频率)倒数进行损失加权” 之间找了一条曲线,通过一个超参数来调优。这样的话我们实际上可以完全可以忽略它的理论部分,直接找一个-log样子的曲线,然后搞个超参数调优,理论上可以获得一样的效果。从这个角度看,本文找出的解析形式意义有限
  • 不过我们或许可以反过来用这个方法,先对 β \beta β 进行调优找到最佳损失权重,取倒数就能得到这个类的有效样本数,或者说信息量。这样或许可以得到一些比较关系,比如哪个类信息量更大之类的

2. 文章2:CReST

  • 【CVPR2021】【类别不均衡问题】【半监督】:CReST: A Class-Rebalancing Self-Training Framework for Imbalanced Semi-Supervised Learning
  • 核心idea:在类别不平衡的半监督学习任务中,目前半监督学习(SSL)方法(如FixMatch)生成伪标签的特点为:多数类召回率高但伪标签精度低;少数类召回率低但伪标签精度高。利用这一特性,我们在每轮迭代时以更大的概率将带伪标记的少数类样本添加到标记集合并重新训练SSL模型,使得各类别样本数量均匀。

2.1 abstract

  • 类不平衡数据的半监督学习是一个正在研究中的现实问题。 虽然现有的半监督学习(SSL)方法在少数类别上表现不佳,但我们发现它们仍然会在少数类别上生成高精度的伪标签。利用此特点,我们在这项工作中提出了类重新平衡自训练(CReST: Class-Rebalancing Self-Training),这是一个简单而有效的框架,可以用于改进类不平衡数据上的现有SSL方法。CReST通过对未标记集中的样本添加伪标记扩展标记集,迭代地训练baseline SSL模型。在向标记集添加伪标签样本时,根据估计的类别分布以更大概率选择少数类的伪标记样本。 我们还提出了一种渐进分布对齐方式 CReST+,可以适应性地调整再平衡强度。CReST 和 CReST+ 可以在各种类别不平衡数据集上提升目前state-of-the-art SSL算法的性能,并且始终优于其他流行的重平衡方法。

2.2 目前SSL方法在类别不均衡数据集上的表现

  • 在 CIFAR10 长尾数据集上的实验结果如下图所示
    在这里插入图片描述

    1. (a)训练集中标记和未标记的集合都是类别不平衡的,其中最多数类样本比最少数类样本多100倍;测试集保持类别平衡。
    2. (b)FixMatch 模型的精度和召回率。 尽管少数类的召回率较低,但它们具有很高的精度
    3. (c)和(d)展示了本文提出的CReST和CReST+,(c)说明这两种方法改善了伪标签的质量,因此(d)所示的类别平衡的测试集中数据召回率有所提升,尤其是少数类。
  • 下图说明了同样的问题:少数类的召回率较低,但它们具有很高的精度
    在这里插入图片描述
    这个实验中作者使用了解决半监督问题的SOTA方法:FixMatch,数据集是诱导为长尾分布的CIFAR10-LT和CIFAR100-LT。

  • 实验现象是符合直观的,由于模型对多数类过拟合,更倾向于给少数类样本打上多数类标记,只有特别有把握的少数类样本才会被正确标记,因此准确率特别高

2.3 训练方法

2.3.1 自训练(self-training)

  • self-training可能是最早被提出来的半监督学习方法,最早可以追溯到Scudder(1965)。这是SSL中广泛使用的一种迭代方法,其中每一轮迭代涉及两个步骤。

    1. 首先,在标记集上训练模型以获得教师模型。
    2. 其次,使用教师模型为未标记数据 u m u_m um 生成伪标记 y ^ m \hat{y}_m y^m。按照一定标准选出一个或一些伪标记组成集合 U ^ = { ( u m , y ^ m ) } m = 1 M \hat{U} =\{(u_m,\hat{y}_m)\}_{m=1}^M U^{(um,y^m)}m=1M,将此集合合并到标记集合中 X ′ = X ∪ U ^ \mathcal{X'} = \mathcal{X} \cup \hat{U} X=XU^,用于下一代训练。
  • 算法框架如下
    在这里插入图片描述

  • 伪代码如下(这个伪代码用置信度作为选取伪标记样本的依据,也可是其他标准)
    在这里插入图片描述

2.3.2 类再平衡的自训练(Class-rebalancing self-training)

  • 为了适应不平衡类别,文章对self-traning进行了两处修改

    1. 训练过程中,不只使用标记数据,而是用SSL方法在整个数据集上训练(包括有标记数据和无标记数据)
    2. 在把选出的伪标记集合 U ^ \hat{U} U^ 并入标记数据集 X \mathcal{X} X 时,不再是直接全部并入,而是并入 U ^ \hat{U} U^ 的某个子集 S ^ ⊂ U ^ \hat{S} \subset \hat{U} S^U^。我们遵循类平衡规则选择 S ^ \hat{S} S^,即类别 l l l 出现的概率越低,就将越多伪标记为 l l l 的样本选入 S ^ \hat{S} S^
  • 第二处修改需要知道样本的类别比例,文章中使用标记集估计类的分布。具体地说,伪标签为类别 l l l 的样本被选入 S ^ \hat{S} S^ 的概率为
    μ l = ( N L + 1 − l N 1 ) α \mu_l = (\frac{N_{L+1-l}}{N_1})^\alpha μl=(N1NL+1l)α
    其中 N i N_i Ni 代表 U ^ \hat{U} U^ 中第 i i i 类样本数量, α ≥ 0 α≥0 α0 用于调整采样率,从而调整 S ^ \hat{S} S^ 的大小。

  • 以一个10类不平衡数据集为例(从1到10类样本数越来越少),不平衡比例 γ = N 1 N 10 = 100 γ= \frac{N_1}{ N_{10}} = 100 γ=N10N1=100 。对于最少数类别10,由于 µ 10 = ( N 10 + 1 − 10 N 1 ) α = 1 µ_{10} =(\frac{N_{10 + 1−10}}{N_1} )^α= 1 µ10=(N1N10+110)α=1,所有伪标签为类别10的都被选入 S ^ \hat{S} S^;而对于最多数类别1,入选概率为 μ 1 = ( N 10 + 1 − 1 N 1 ) α = 0.0 1 α μ_1=(\frac{N_{10 + 1−1}}{N_1} )^α = 0.01^\alpha μ1=(N1N10+11)α=0.01α。当 α = 0 α= 0 α=0,所有类别的入选概率 μ = 1 μ= 1 μ=1,所有未标记的样本都会保留,此时退化到传统的self-training。在每个类别中选择带有伪标签的样本时,我们会选择最有信心的样本。

  • 改进后的CReST算法框架如下
    在这里插入图片描述

  • 作者还将渐进式分布对齐方法(progressive distribution alignment)引入CReST,得到了 CReST+ 方法

2.4 小结

  • 这篇文章比较巧妙的点是利用了原先算法的一个缺点。这个角度出发可能会有一些新idea。我记得去年组会有同学分享过一篇也是这个思路,是利用了过拟合的一个特点,可惜具体记不清了
  • 老师的意见是这篇文章不是很硬,能中CVPR应该是写得好,可以学习一下它的写作。
  • 发现师兄也写了一篇关于本文的分析,贴过来 这篇CVPR文章真是妙蛙种子到了妙妙屋,最后再引用一段师兄的分析
    1. 这些被挑选出来的样本虽然有很大的可能具有正确的伪标记,但它可能不太具备代表性,即不能很好的代表这个类。换句话来说,模型对这些样本具有很大的置信度,即这些极可能是简单样本,对模型的学习帮助性可能不大,因此此时模型已经很确信能将其预测对了,此时再引入这些样本的loss其实很小,对模型的影响也不大。
    2. 针对前面所提到的,所以我认为可能性能的提升绝大部分来自于类别平衡了,当然正确的简单样本的引入也会对模型性能提升有帮助。
    3. 这个方法由此也会在半监督场景下作用明显,因此本来就没啥有标记样本,还如此的类别不平衡,此时给一些正确标记的虽然简单的样本对模型训练也是很有帮助的。

3. 文章3:Solve PDE

  • 【computational physics 2018】【解偏微分方程】Learning Parameters and Constitutive Relationships with Physics Informed Deep Neural Networks
  • 核心idea:这一篇算是一个把机器学习方法应用到计算物理领域的跨界论文。本文研究复杂物理动力学问题的解法(比如解湍流中某个点的流速、海绵中水的流速等),这些现象可以表示为偏微分方程形式,但是由于过于复杂无法给出解析解。作者利用深度神经网络可以拟合任意复杂函数这一特点,提出了一种使用神经网络解复杂偏微分方程的方法,文章使用神经网络拟合了微分方程中的几个关键函数,从而拟合了整个方程。
  • 从ML的角度看,作者是希望使用机器学习方法学习一个复杂的映射关系,这个映射关系满足某个偏微分方程。偏微分方程这个解析形式可以看做某种先验,只需要使用神经网络拟合微分方程中的几个关键函数,即可得到目标映射关系。这样就把一个复杂网络化简为几个简单网络,并减少了训练网络所需的样本数量。
  • 我认为这个算是对神经网络的一种应用,通过考虑问题特性(符合偏微分方程)引入先验简化网络算是一点trick,所以本文不大篇幅介绍了

3.1 abstract

  • We present a physics informed deep neural network (DNN) method for estimating parameters and unknown physics (constitutive relationships) in partial differential equation (PDE) models. We use PDEs in addition to measurements to train DNNs to approximate unknown parameters and constitutive relationships as well as states. The proposed approach increases the accuracy of DNN approximations of partially known functions when a limited number of measurements is available and allows for training DNNs when no direct measurements of the functions of interest are available. We employ physics informed DNNs to estimate the unknown space-dependent diffusion coefficient in a linear diffusion equation and an unknown constitutive relationship in a non-linear diffusion equation. For the parameter estimation problem, we assume that partial measurements of the coefficient and states are available and demonstrate that under these conditions, the proposed method is more accurate than state-of-the-art methods. For the non-linear diffusion PDE model with a fully unknown constitutive relationship (i.e., no measurements of constitutive relationship are available), the physics informed DNN method can accurately estimate the non-linear constitutive relationship based on state measurements only. Finally, we demonstrate that the proposed method remains accurate in the presence of measurement noise

4. 文章4:NLNL

  • 【ICCV2019】【噪声标记】NLNL: Negative Learning for Noisy Labels
  • 参考译文
  • 核心idea:使用CNN进行图像分类时,如果数据存在噪声(错误标记的样本),会导致模型过拟合。文章提出 “负学习” 的概念来缓解这个问题。普通的学习过程是这样的,对于每一张图片样本,告诉CNN这张图 什么,作者称其为 “正学习” ;与之相对的,“负学习” 是指对于每一张图片样本,告诉CNN这张图不是什么。在正学习中,噪声样本只能误导CNN,而负学习中噪声样本也能提供很多有效信息。为了增加收敛性,作者混合正学习和负学习的过程,提出了SelNLPL框架

4.1 abstract

  • 图像分类任务中,卷积神经网络(CNN)具有出色的性能。 训练CNN的经典方法是正学习(Positive Learning:PL),其监督形式为 “输入图像属于此标签” 。如果将标记正确分配给所有图像,则这是一种快速而准确的方法。
  • 但是,如果存在不正确的标签或嘈杂的标签,则使用PL进行训练会提供错误的信息,从而严重降低性能。为了解决这个问题,我们从一种称为负学习(NL)的间接学习方法开始,在该方法中,CNN使用互补标签进行训练,即 “输入图像不属于该互补标签”。 因为选择真实标签作为补充标签的机会很小,所以NL降低了提供不正确信息的风险。 此外,为了提高收敛性,我们选择性地混合PL来扩展我们的方法,称为选择性负学习和正学习 (SelNLPL)。 PL有选择地用于训练要清洗的预期数据,随着NL的进行,这些数据的选择成为可能,因此具有滤除有噪数据的出色性能。 通过简单的半监督训练技术,我们的方法实现了有噪数据分类的 state-of-the-art 准确性,证明了SelNLPL的有噪数据过滤能力的优越性。

4.2 负学习(Negative Learning:NL)

  • 前面已经说明,NL的目标是把CNN训练为 “输入图像不属于此互补标签”

4.2.1 生成互补标签

  • 对于某个样例,直接从此样例标签以外的标签空间 Y \mathcal{Y} Y 中随机选一个作为其互补标签。
    在这里插入图片描述

4.2.2 损失函数

  • 考虑一个 c-class 分类问题,输入为 x ∈ X x \in \mathcal{X} xX,标签 y ∈ Y = { 1 , 2 , . . . , c } y \in \mathcal{Y}=\{1,2,...,c\} yY={1,2,...,c} 的互补标签为 y ˉ = Y ∖ { y } \bar{y} = \mathcal{Y} \setminus \{y\} yˉ=Y{y}。使用softmax可得到标签为 k k k 的概率 p k p_k pk
  • 对于一般的正学习,损失为
    L ( f , y ) = − ∑ k = 1 c y k l o g p k \mathcal{L} (f,y) = -\sum_{k=1}^c y_k logp_k L(f,y)=k=1cyklogpk
  • 使用上述损失,正学习的优化目标是 p y → 1 p_y \to 1 py1;与之相反,负学习的优化目标是 p y ˉ → 0 p_{\bar{y}} \to 0 pyˉ0,提出NL的损失如下
    L ( f , y ˉ ) = − ∑ k = 1 c y k ˉ l o g ( 1 − p k ) \mathcal{L} (f,\bar{y}) = -\sum_{k=1}^c \bar{y_k} log(1-p_k ) L(f,yˉ)=k=1cykˉlog(1pk)

4.2.3 NL的效果

  • 改造CIFAR10数据集,把30%数据改用噪声标签,测试如下(注意:实验的PL和NL使用不同的损失函数训练,不过为了统一对比,图中显示的NL损失是按PL损失公式计算的)
    在这里插入图片描述
    如图可见,在噪声数据集上直接使用PL方法,会导致严重过拟合,测试集上损失和精度都不佳,而NL则没有这个问题
  • 使用同样的数据集,PL(左) 和 NL(右) 得到的样本标记置信度情况如下(蓝色是干净样本,黄色是噪声样本)
    在这里插入图片描述
    如图可见,NL学习后,噪声样本的标记置信度都很低,利用这一点,可以把噪声样本分离出来

4.3 选择性正负学习(Selective NL and PL:SelNLPL)

  • 单纯的NL有利于学习噪声数据,但其收敛性不佳,而且对于干净数据,PL有更快的收敛速度和精度,我们希望通过某种方法把噪声样本和干净样本分开,分别使用NL和PL进行训练
  • 利用置信度,我们可以实现这种划分
    1. Selective NL(SelNL):NL之后,对置信度大于阈值 1 c \frac{1}{c} c1 的样本集合再次进行NL
    2. Selective PL(SelPL):对置信度大于阈值 γ \gamma γ 的样本集合进行PL
  • NL可以通过置信度对训练样例进行粗略划分,SelNL进一步划分,两次划分后再进行PL,这就得到了本文提出的 SelNLPL 框架
    在这里插入图片描述
    (Eq1和Eq2分布为PL和NL的损失函数公式)
  • 改造CIFAR10数据集,把30%数据改用噪声标签,SelNL(左)和SelNLPL(右)后的置信度情况如下
    在这里插入图片描述

4.4 使用SelNLPL进行半监督学习

  • 借助SelNLPL的区分能力,文章提出了一种利用噪声数据进行训练的方法。首先使用SelNLPL划分训练样例,用干净数据进行PL训练一个CNN,给噪声样本重新打标记,最后用所有样例一起PL训练最终CNN
    在这里插入图片描述

4.5 小结

  • 这里直接把文中总结的 “本文贡献” 放出来
    1. 我们将负学习(NL)的概念应用于嘈杂的数据分类问题,并验证了它可以防止CNN过拟合噪声数据
    2. 利用负学习(NL),我们引入了一个称为SelNLPL的新框架,用于从训练数据中滤除噪声数据。在NL之后,再对高置信度的训练数据应用PL,可以实现对噪声数据的准确过滤。
    3. 我们基于SelNLPL实现的高级噪声数据过滤,通过相对简单的半监督学习获得了 state-of-the-art 噪声数据分类结果。
    4. 我们的方法不需要任何有关噪声数据点类型或数量的先验知识。 它不需要对依赖于先验知识的超参数进行任何调整,从而使我们的方法适用于现实生活
  • 分享本文的学长尝试复现了这篇文章,表示NL部分收敛困难

5. 文章5:SELF

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

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

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

打赏作者

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

抵扣说明:

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

余额充值