AutoAugment: Learning Augmentation Policies from Data(一种自动数据增强技术)

谷歌大脑提出自动数据增强方法AutoAugment:可迁移至不同数据集

近日,来自谷歌大脑的研究者在 arXiv 上发表论文,提出一种自动搜索合适数据增强策略的方法 AutoAugment,该方法创建一个数据增强策略的搜索空间,利用搜索算法选取适合特定数据集的数据增强策略。此外,从一个数据集中学到的策略能够很好地迁移到其它相似的数据集上。

论文地址:https://arxiv.org/pdf/1805.09501v1.pdf

目前还未有公开代码

摘要

在本论文中,我们进一步研究了用于图像的数据增强技术,并提出了一个名为「AutoAugment」的简单过程,用来搜索改进的数据增强策略。本文主要的观点是创建一个数据增强策略的搜索空间,直接在感兴趣的数据集上评估特定策略的质量。在「AutoAugment」的实现过程中,我们设计了一个搜索空间,该搜索空间中的一个策略包含了许多子策略,我们为每个小批量(mini-batch)中的每张图像随机选择一个子策略。每个子策略由两个操作组成,每个操作都是类似于平移、旋转或剪切的图像处理函数,以及应用这些函数的概率和幅度(magnitude)。我们使用搜索算法来寻找最佳策略,这样神经网络就能在目标数据集上获得最高的验证准确率。我们的方法在 CIFAR-10、CIFAR-100、SVHN 和 ImageNet 上取得了目前最高的准确率(在不加入额外数据的情况下)。在 ImageNet 上,我们取得了 83.54% 的 Top-1 准确率。在 CIFAR-10 上,我们取得了 1.48% 的误差率,比之前最佳模型的误差率低 0.65%。在简化数据集上,AutoAugment 的性能与不使用任何非标注样本的半监督学习方法相当。最后,从一个数据集中学到的策略能够被很好地迁移到其它相似的数据集上。例如,在 ImageNet 上学到的策略能够让我们在细粒度视觉分类数据集 Stanford Cars 上取得目前最高的准确率,并且不用在额外的数据上对预训练的权重进行调优。

引言

深度网络是一个功能强大的机器功能系统,但是在海量数据集上才能充分发挥其优势。数据增强是一种通过随机的增强技术可以同时增加数据数量和多样性的策略。

在图像领域,常见的增强包括将图像平移几个像素,或水平翻转图像。直观的来说数据增强是在教模型学习数据领域的不变性。目标分类通常对水平翻转或平移是不敏感的。网络架构也可以被用于对不变性进行硬编码。使得模型对于水平翻转和平移都不敏感。可以使用网络架构去编码这种不变性。如使用卷积网络平移来动平移不变性。物理模型可以对个总操作不变性。然而使用数据增强去阐明这种潜在的不变性可能要比直接在模型架构中硬编码这种不变性要简单一点。而物理模型适用于平移、旋转和原子排列的不变性 [7-12]。然而,使用数据增强技术来表达潜在的不变性比直接将不变性硬编码到模型中更简单。

机器学习和计算机视觉社区的一个大的关注点是设计出更好的网络架构(例如 [13-21])。人们较少将精力放在寻找引入更多不变性的更好的数据增强方法上。例如,在 ImageNet 上,Alex 等人 [3] 在 2012 年引入的数据增强方法仍然是现在的标准操作,仅有微小的改变。即使对特定数据集找到了数据增强的改进方法,这些方法通常也不能有效地迁移到其他的数据集上。例如,在训练期间对图像进行水平翻转在 CIFAR-10 数据集上是一个有效的数据增强方法,但是在 MNIST 上并不奏效,这是因为这些数据集中出现的对称性不同。最近,对自动学习到的数据增强技术的需求发展成为一个重要的待解决问题 [22]。

作者旨在实现为目标数据集寻找有效数据增强策略的自动化过程。

在本文第三节的实现中,每个策略都表示一些可能的数据增强操作的选项和顺序,其中每一个操作是图像处理函数(例如,平移、旋转或色彩归一化),及应用该函数的概率和幅度(magnitude)。作者使用一种搜索算法寻找这些操作的最佳选项和顺序,以使这样训练出的神经网络能获得最佳的验证准确率。在本文的实验中,作者使用增强学习 [23] 作为搜索算法,但是作者认为如果使用更好的算法 [21,24],结果可以得到进一步改进。

作者提出的方法在 CIFAR-10、简化的 CIFAR-10、CIFAR-100、SVHN、简化的 SVHN,以及 ImageNet(不添加额外数据)等数据集上取得了目前最高的准确率。在 CIFAR-10 上的误差率为 1.48%,比之前最先进的模型 [21] 的误差率低 0.65%。在 SVHN 上,作者将目前最低的误差率从 1.30% [25] 降低到了 1.02%。在简化数据集上,本文提出的方法取得了和不使用任何非标注数据的半监督方法相当的性能。在 ImageNet 数据集上,作者提出的方法达到了 83.54% 的 Top-1 准确率。最后,作者展示了在一个任务中找到的策略可以很好地泛化到不同的模型和数据集上。例如,在 ImageNet 上发现的策略能在各种各样的 FGVC 数据集上带来显著的性能提升。即使在那些对在 ImageNet 上预训练好的权重进行调优也帮助不大的数据集上 [26],例如 Stanford Cars [27] 和 FGVC Aircraft [28],使用 ImageNet 上的策略训练可以分别减少 1.16% 和 1.76% 的误差率。这一结果表明迁移数据增强策略为迁移学习提供了一种新的可选方案。

相关工作

图像识别的常用数据增强方法是手动设计的,最佳传播方法是数据集特定的。例如,在MNIST上,大多数顶级模型使用弹性扭曲,缩放,平移和旋转[2,29-31]。在自然图像数据集上,如CIFAR-10和ImageNet,随机裁剪,图像镜像和色彩漂移/白化更为常见[3]。由于这些方法是手动设计的,因此需要专业知识和时间。

从数据中学习数据增强策略的方法原则上可以用于任何数据集,而不仅仅是一个。本文介绍了一种从数据中查找数据增强策略的自动化方法。方法的灵感来自于体系结构搜索的最新进展,其中强化学习和进化被用于从数据中发现模型体系结构[19,21,23,32-40]。这些方法在人为设计的体系结构上得到了改进,但仅使用体系结构搜索在CIFAR-10上无法击败2%的错误率障碍。

Generative adversarial networks(生成对抗网络),先前对学习数据增强的尝试包括智能增强,其提出了通过合并来自同一类的两个或更多个样本来自动生成增强数据的网络[41]。 Tran等人。 使用贝叶斯方法来生成基于从训练集中学习到的分布的数据[42]。 DeVries和Taylor在学习的特征空间中使用简单的转换来增加数据[43]。

生成对抗网络也已用于生成附加数据(例如,[44-48])。 我们的方法和生成模型之间的主要区别在于我们的方法生成符号转换操作,而生成模型(如GAN)直接生成增强数据。 Ratner等人使用GAN生成描述数据增强策略的序列[49],这是一个例外。

自动增强

作者将寻找最佳数据增强策略的问题形式化为一个离散搜索问题。在搜索空间中,一个策略由 5 个子策略组成,每个子策略又包含依次被应用的两个图像处理操作,每个操作也都和两个超参数相关:1)应用操作的概率 2)操作的幅度。

图 1 展示了在搜索空间中的一个包含 5 个子策略的策略示例。第一个子策略指定了依次进行对 X 坐标的剪切(ShearX)和图像翻转操作(Invert)。应用 ShearX 操作的概率是 0.9,并且当应用这个操作时,其幅度为十分之七。接着,作者以 0.8 的概率应用 Invert 操作,该操作不使用幅度信息。作者强调这些操作需要按照指定顺序执行。图 1:在 SVHN 上发现的一个策略,以及如何使用它在给定用于训练神经网络的原始图像的条件下来生成增强后的数据。这个策略包含 5 个子策略。对于小批量中的每一张图像,作者均匀地随机选取一个子策略去生成一张变换后的图像来训练神经网络。每个子策略由两个操作组成,每个操作都与两个数值相关联:调用操作的概率、操作的幅度。由于存在调用操作的概率,因此该操作在这个小批量中可能不被应用。然而,如果它被应用了,这个应用的幅度就是固定的。作者通过展示即使使用相同的子策略,一个示例图片能够在不同的小批量中被不同地变换,强调了应用子策略的随机性。正如文中所解释的,在 SVHN 上,AutoAugment 更常采取几何变换措施。我们可以从中看出为什么翻转(Invert)在 SVHN 上是一个被普遍选择的操作,因为图像中的数字在这种变换下具有不变性。

搜索操作空间:我们在实验中使用的操作来自PIL,这是一种流行的操作Python图像库,为了多功能性,我们考虑在PIL中图像的所有功能。PIL中接收一副图片作为输入然后以另一个图片作为输出。我们还额外增加了使用了另外两个有前景的增强技术:Cutout [25]和SamplePairing [50]。我们搜索的操作是ShearX / Y,TranslateX / Y,旋转,自动对比度,反转,均衡,曝光,分层,对比度,颜色,亮度,清晰度,切口[25],样本配对[50]。通常,我们在搜索空间中有16个操作。每该操作还具有默认的幅度范围,这将在下面更详细地描述,在第4节中,我们将操作的幅值离散化为10个离散值,以便我们可以使用一个离散算法去寻找它们。离散量范围是10个值(均匀间距)。我们也把应用这个操作的概率离散为11个值,这是11个值也是均匀分布的。因此搜索每个子策略就变成了在(16*10*11)的平方可能中组合搜索一种可能性的问题。那么一种策略中包括5个子策略,每个子策略中包含了两个图像处理操作,每种操作有16*10*11种组合。所以最后就变成了一个在(16*10*11)的10次方的搜索问题。2.9 × (10的32次方中可能性。)我们使用的16个操作及其默认值范围如附录的表1所示。注意我们的搜索空间中没有明确的“身份”操作; 此操作是隐式的,可以通过调用概率设置为0的操作来实现。

搜索算法的细节:

我们在实验中使用的搜索算法使用强化学习,受到[19,23,32,51]的启发。 搜索算法有两个组成部分:一个是递归神经网络的控制器,另一个是近似策略优化算法[52]的训练算法。 在每一步,控制器预测由softmax产生的决定;然后将这个预测作为一个embedding,总共需要控制器有30个softmax预测值,因为有5个子策略,每个子策略中有2个操作,每个操作中需要预测出操作的类型,操作的幅度,操作实施的概率。所以是5*2*3。

这个控制器是如何训练的呢?这个控制器由一个奖励信号进行训练。这个奖励信号就是所找到的策略在子模型的泛化能力在提高程度。子模型是作为搜索过程中的一部分训练的神经网络。在实验中,我们留出了一个验证集去度量在子模型上的泛化性能。子模型的训练是用5种子策略在训练集中产生的增强数据进行训练的。对于一个 mini-batch中的每个样例,随机选择5种子策略中的一个去增强图像。然后使用子模型去在验证集上度量准确率,这个准确率就是充当奖励信号去训练RNN控制器模型。在每个数据集合上,在每个数据集中,控制器大概抽样出15000个策略。这个控制器的训练过程和超参数设置都是遵循【19】Barret Zoph, Vijay Vasudevan, Jonathon Shlens, and Quoc V Le. Learning transferable architectures for scalable image recognition. In Proceedings of IEEE Conference on Computer Vision and Pattern Recognition, 2017.进行设置的。在搜索结束后,我们将子策略连接在一起,这些子策略是从表现最好的5个策略中取出来的,将它们连接成一个包含了25个子策略的单策略。然后将这个包含了25个子策略的策略引用到每个数据集的模型训练上。上述搜索算法是我们可以用来查找最佳策略的许多可能的搜索算法之一。有可能使用不同的离散搜索算法,如遗传编程[21]或甚至随机搜索[24]来改善本文结果。

 

实验结果:

在本节中,我们通过实证研究了我们在CIFAR-10 [53],CIFAR-100 [53],SVHN [54]和ImageNet [55]数据集上的性能。 我们描述了我们用来查找扩充策略的实验。 我们还解释了如何使用这些策略来完全训练模型并在这些数据集上实现最先进的结果。

CIFAR-10 and CIFAR-100 Results

为了节省在增强搜索过程中训练子模型的时间,尽管CIFAR-10有50,000个训练样例,但我们在一个较小的数据集上进行搜索,我们称之为“精简CIFAR-10”,其中包含4,000个随机选取的示例。我们发现对于固定的训练时间,更好的效果是让子模型驯良更多的轮数,而不是在大的数据集上让子模型训练较少的轮数。我们使用小型Wide-ResNet-40-2(40层 - 加宽因子2)模型,作为子模型的结构。训练120轮,使用小型Wide-ResNet可以提高计算效率,因为每个子模型都是从头开始训练来计算控制器的梯度更新。我们使用10-4的权重衰减,学习率为0.01,和一个退火周期的余弦学习衰退[57]。在搜索减少的CIFAR-10期间找到的策略后来用于训练CIFAR-10,减少CIFAR-10和CIFAR-100的最终模型。如上所述,我们将最好的5个策略中的子策略连接起来,形成包含25个子策略的单个策略,用于CIFAR数据集上的所有AutoAugment实验。基线预处理遵循最先进的CIFAR-10模型的惯例:标准化数据,使用50%概率的水平翻转,零填充和随机裁剪,最后切割16x16像素[19,21, 58,59]。 除了标准基线预处理之外,还应用autoAugment策略:在一个图像上,我们首先应用现有基准方法提供的基线增强,然后应用AutoAugment策略,然后应用Cutout。 我们没有优化Cutout区域大小,并使用建议的16像素值[25]。 请注意,因为Cutout是搜索空间中的一项操作,所以Cutout可能在同一图像上使用两次:第一次使用所学习到的区域大小,第二次使用固定区域大小。 实际上,由于在第一个应用中Cutout操作的概率很小,所以Cutout通常在给定图像上使用一次。在CIFAR-10上,AutoAugment主要挑选基于颜色的转换。 例如,CIFAR-10上最常采用的转换是Equalize,AutoContrast,Color和Brightness(请参阅附录中的表1以了解其说明)。 像ShearX和ShearY这样的几何变换很少在良好的策略中找到。 此外,Invert转型几乎从未应用于成功的政策。 附录中列出了CIFAR-10中的政策。 下面,我们使用CIFAR-10降低的政策在CIFAR atasets上描述我们的结果。 所有报告的结果在5次运行中取平均值。CIFAR-10结果。在表1中,我们展示了不同神经网络结构的测试集精度。我们在TensorFlow [60]中实现Wide-ResNet-28-10 [56],Shake-Shake [58]和ShakeDrop [59]模型,权重衰减和学习率超参数,是选取了常规训练+基线增强,然后挑选出验证集上表现最好的超参数。其他超参数与引入模型的论文中报道的相同[56,58,59]。然后,我们使用相同的模型和超参数来评估AutoAugment的测试集精度。对于AmoebaNets,我们使用[21]中用于基线增强和AutoAugment的相同超参数。从表中可以看出,使用ShakeDrop [59]模型的错误率为1.48%,比最先进的[21]高出0.65%。请注意,此贡献远远高于AmoebaNet-B对ShakeDrop(+ 0.18%)以及ShakeDrop对Shake-Shake(+ 0.25%)所获得的贡献。我们也是第一种打破长期2%错误率壁垒的方法。表1:CIFAR-10上的测试集错误率(%)。 越低越好。 基线模型的所有结果以及基于Cutout的基线模型均在我们的实验中重复使用,并与以前报告的结果相匹配[25,56,58,59]。 一个例外是Shake-Shake(26 2x112d),它有更多的过滤器最大的模型在[58] - 112比96,结果以前没有报道过。 请注意,最佳政策可在减少的CIFAR-10上找到。

CIFAR-100 Results.

我们还使用与CIFAR-10相同的AutoAugment策略在CIFAR-100上对模型进行培训; 结果显示在表2中。再次,我们在该数据集上获得了最新结果,超过了之前通过ShakeDrop正则化[12]记录的12.19%错误率。表2:CIFAR-100上的测试集错误率(%)。 我们的实验中复制了Wide-ResNet和ShakeDrop的基线和切除结果,并与先前报道的结果相匹配[25,59]。 请注意,最佳政策可在精简的CIFAR-10上找到。

A comparison against Semi-Supervised Learning.

最后,我们应用相同的AutoAugment策略来训练减少CIFAR-10的模型,以及我们用来找到最佳策略的4000个示例培训集。这个实验设置类似于半监督学习社区提出的实验惯例[61-65]。请注意,在虚拟对抗训练和熵最小化[62]中,这一领域报道的最新误差率范围从一致性正则化(Π-M)的12.36%[64]到10.55%,所有这些都利用额外的46,000个未标记的例子。我们在表3中用Wide-ResNet-28-10 [56]所显示的结果仅略低于半监督方法中的最新误差率(如[65]所总结的),其使用

他们的训练中还有46,000个未标记的样本。当我们使用不同的模型Shake-Shake时,我们优于所有报告的半监督结果,而不使用任何未标记的样本。我们注意到由于AutoAugment而导致的准确度提高对于减少数据集与完整数据集进行比较。随着培训集的规模增长,我们预计数据增加的效果将会降低。但是,在接下来的部分中,我们将展示即使对于像SVHN和ImageNet这样的大型数据集,AutoAugment仍然可以提高泛化精度。

SVHN Results

表3:减少CIFAR-10的测试集错误率(%),其具有4,000个训练实例。 错误率越低越好。 请注意,这与我们用来查找最佳策略的训练集相同。 我们的结果与10.55%的半监督式学习中的最新技术相媲美,无需使用其他数据。

我们尝试了SVHN数据集[54],其中有73,257个训练样例(也称为“核心训练集”)和531,131个额外的训练样例。 测试集有26,032个例子。在搜索过程中,我们创建了一个包含1,000个随机抽样示例的SVHN数据集来自核心训练集。我们使用AutoAugment来查找最佳策略。模型架构和儿童模型的训练程序与上述CIFAR-10实验相同。在SVHN上选择的策略与在CIFAR-10上选择的转换不同。对于例如,SVHN上最常见的变换是Invert,Equalize,ShearX / Y和旋转。如上所述,转换反转几乎从未在CIFAR-10上使用过,但事实如此成功的SVHN策略非常普遍。直觉上,这是有道理的,因为具体的颜色数字不如数字及其背景的相对颜色重要。此外,几何变换ShearX / Y是SVHN上最流行的两种变换。这个也可以通过SVHN中的图像的一般属性来理解:房屋号码通常是自然的在数据集中剪切并偏斜,因此通过经数据增强来学习这种变换的不变性是有帮助的。图1中的SVHN示例显示了五个成功的子策略。搜索结束后,我们连接5个最佳策略并将其应用于训练架构使用标准增强策略已经在SVHN上表现良好。如需充分训练,我们将遵循在Wide-ResNet论文[56]中提到的使用核心训练集和核心训练集和额外的数据。验证集是通过忽略训练集的最后7325个样本而构建的。我们调整验证集性能的权重衰减和学习率。其他超参数训练细节与介绍模型的论文中的细节相同[56,58]。一个不同之处在于因为完整SVHN数据集的大尺寸,我们只对Shake-Shake模型训练160轮(而不是1800)。基线预处理涉及标准化数据并按照[25]中所述的步骤应用区域大小为20x20像素的Cutout。AutoAugment结果将基线预处理与SVHN上学到的策略结合起来。一个例外是我们在减少SVHN时不使用Cutout,因为它显着降低了准确性。该该实验的结果总结如表4所示。从表中可以看出,我们使用两种模型获得最新的精确度。

表4:测试集错误率(%)。错误率越低越好。 AA指的是AutoAugment。减少SVHN数据集:我们用于查找最佳策略的相同训练集的结果。在我们的实验中复制了减少SVHN的Wide-ResNet基线结果,并且大致匹配先前报告的结果(我们的结果高出0.38%,可能是由于超参数调整)[65]。 SVHN数据集:使用基线增强[56]和Cutout [25]的Wide-ResNet结果在我们的实验中被复制,并与之前报告的结果相匹配。以前没有报道过SVHN的摇晃结果。请注意,AutoAugment策略可在减少的SVHN上找到。我们还测试了减少SVHN的最佳策略(在找到最佳策略的同一个示例培训集中)。缩减集合上的AutoAugment结果与领先的半监督方法相当,范围从5.42%到3.86%[62]。 (见表4)。我们再次看到AutoAugment在简化数据集方面比完整数据集带来了更显着的改进。

ImageNet Results

与上述实验类似,我们使用ImageNet训练集的简化子集,120个类(随机选择)和6,000个样本,以搜索策略。 我们使用余弦衰减训练Wide-ResNet 40-2 200轮。 使用10-5的体重衰减以及0.1的学习率。 ImageNet上的最佳策略类似于CIFAR-10上的策略,重点在于基于颜色的6次转换。 一个不同之处在于ImageNet策略通常使用几何变换Rotate。 图2中显示了最佳策略之一。图2:ImageNet上成功的策略之一。 正如文中所述,ImageNet上的大多数策略都使用基于颜色的转换。再次,我们将总共25个子策略的5个最佳策略组合在一起,以创建最终策略ImageNet培训。 然后,我们使用ResNet-50和ResNet-200模型对这个策略进行完整的ImageNet网络训练,时间为270个时期。 我们使用批量大小4096和学习率1.6。 对于基线增强,我们使用标准的初始样式预处理,其涉及将像素值缩放到[-1,1],水平翻转50% 概率和颜色的随机失真[14,66]。 对于使用AutoAugment进行培训的模型,我们使用基准预处理和在ImageNet上学习的策略。 我们发现消除颜色的随机扭曲并不会改变autoAugment的结果。

Fine Grained Visual Classification Datasets

为了评估在ImageNet上发现的策略的可转移性,我们使用与图像大小类似于ImageNet的五个FGVC数据集在ImageNet上学习的相同策略(并用于表5的结果)。 这些数据集具有挑战性,因为它们具有相对较少的训练样例集,同时具有大量类。

Discussion

Relation between training steps and number of sub-policies:(子策略的数量和训练轮数之间的关系)

本文工作的一个重要方面就是随机的在训练期间随机应用子策略,在每个minibatch上的每张图片只是使用众多子策略中的一个进行增强,这里又会产生进一步的随机性,因为每个每一种转化又会有一定的概率。我们发现这种随机性要使得自动增强生效对于每种子策略必须要保证一定的训练轮数。因为每个子模型每次都是由5种子策略进行训练,需要80-100轮的训练才能让模型从这些子模型中充分受益。每种子策略都需要一定的时间才能让模型从中受益。当策略学习完后,训练模型将要花费更多的时间进行训练。

Importance of Diversity in AutoAugment Policies:(多样自动增强策略的重要性)

我们的假设是当我们增加子策略的数量的时候,网络在相同数据集中训练时,会有更多的增强多样性。这样会增加模型的泛化性能,为了验证这一假设,我们研究了充分在cifar-10上经过充分训练的Wide-ResNet-28-10模型的验证集平均准确度。以此来作为训练过程中子策略数量的函数。我们随机从中选择500个良好的策略池中选择子策略集。用这些子策略集去训练Wide-ResNet-28-10 200轮,对每个集合的大小,我们对子策略进行五次不同的采样以获得更好的统计数据 ,模型训练的细节和上面的 Wide-ResNet-28-10 在CIFAR-10上的训练一样。图3显示了平均验证集的准确性,作为培训中使用的子策略数量的函数,确认验证准确性提高,更多的子策略达到约20个子策略。

Transferability across datasets and architectures: (跨数据集和体系结构的可转移性)

需要注意的是,上述策略很好地适用于许多模型体系结构和数据集。例如在Wide-ResNet-40-2和精简 CIFAR-10上学习到的策略可以使得在全部CIFAR-10和 CIFAR-100上训练的其他模型架构获得性能上的提升。类似的,在Wide-ResNet-40-2和精简ImageNet上学习到的策略可以使得 Inception v4在具有不同的数据和类别分布的FGVC数据集上获得巨大的性能提升。即使在不同的数据集上学习模型,也永远不会发现AutoAugment策略会损害模型的性能,而对于减少SVHN的Cutout则不是这种情况(表4)。我们在附录中列出了在ImageNet和SVHN上提出最好的策略,有望帮助研究人员提高相关图像分类任务的泛化精度。尽管具有可迁移性,但是我们发现在最接近目标的数据分布上学习的策略产生了最佳性能。当在SVHN上训练时,使用从精简CIFAR-10上学习到的最佳策略相对于基线增强策略确实显著提高了泛化的精确度,但是这种精度的提升并没有应用在SVHN上学习到的策略提升的那么明显。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值