ResNet: Deep Residual Learning for Image Recognition

 

网络:ResNet

结构

Deep

18,32,50,110,1020

 

Conv

Size=3X3(第一层是7X7)

Stride=2

 

Padding

1

 

Max-Pooling

Num=

Size=2X2

Stride=2

 

Before FC

Avg pool

Before FC

FC

num=1, FC=1000, act:softmax

dropout: none

 

 

 

 

 

 

 

优化

输入优化

零均值化(先采样)

 

翻转输入

 

多尺度裁剪[256,480]=>224X224

防止过拟合扩张数据集

 

 

结构优化

3X3卷积核叠加

减少参数, 增加表达能力

BN

激活之前

没有使用LRN

 

1X1卷积核

非线性变化, 减少计算量,增加表达能力

增加网络深度

 

训练优化

重0开始

 

全卷机连接,

 

输出优化

多尺度取平均分[224,256,386,480,640]

 

 

 

 

 

训练

Dataset

ILSVRC-2012

1.3M+50K+100K

梯度下降

SGD

 

Batch-size

256

 

momentum

0.9

 

L2系数

 

Dropout ratio

 

Learning rate

0.1

误差稳定时则除以10

Epochs

 

 

Iteration

60*10^4

 

Weight decay

0.0001

 

Abstract:

更深层次的神经网络更难训练。我们提出了一个残差学习框架,以简化对比以前使用的网络更深入的网络的训练。我们根据层输入显式地将层重新表示为学习残差函数( learning residual functions),而不是学习未定义函数。我们提供了综合的经验证据,表明这些残差网络易于优化,并且可以从大幅度增加的深度中获得精度。在ImageNet数据集上,我们估计残差网络的深度可达152层--是vgg网络的8倍深[41],但仍然具有较低的复杂性。这些残差网的集合在图像集上的误差达到了3.57%。 这个结果获得了ILSVRC2015的分类任务第一名,我们还用CIFAR-10数据集分析了100层和1000层的网络。

表示的深度对于许多视觉识别任务是非常重要的。仅仅由于我们的表示非常深入,我们在coco对象检测数据集上得到了28%的相对改进。 深度残差网络是我们参加ILSVRC & COCO 2015 竞赛上所使用模型的基础,并且我们在ImageNet检测、ImageNet定位、COCO检测以及COCO分割上均获得了第一名的成绩。

 

1. Introduction

深层卷积神经网络[22,21]导致了图像分类[21,50,40]的一系列突破。深层网络自然地将低/中/高层次特征[50]和分类器以端到端的多层方式集成在一起,而特征的“层次”可以通过堆叠层的数量((深度)来丰富。最近的证据[41,44]表明,网络深度至关重要,在富有挑战性的ImageNet数据集[36]上的领先结果[41,44,13,16]都利用了“非常深”[41]模型,深度为16[41]至30[16]。许多其他非平凡(nontrivial)的视觉识别任务[8,12,7,32,27]也从非常深入的模型中获益良多。

在深度重要性的驱动下,出现了一个问题:学习更好的网络就像堆积更多的层一样容易吗?回答这个问题的一个障碍是臭名昭著的梯度消失/爆炸[1,9]的问题,它从一开始就阻碍了收敛(hamper convergence )。然而,这个问题在很大程度上是通过标准化初始化[23,9,37,13]和中间归一化层[16]来解决的,这使得数十层的网络在反向传播的随机梯度下降(SGD)上能够收敛。

当更深的网络能够开始收敛时,一个退化的问题就暴露出来了:随着网络深度的增加,精确度变得饱和(这可能不足为奇),然后迅速退化。出乎意料的是,这种退化并不是由于过度拟合造成的,而且在适当深度的模型中增加更多的层会导致更高的训练误差,正如[11,42]中所报告的,并通过我们的实验进行了彻底验证。图1显示了一个典型的例子。

(训练精度的)退化表明,并非所有系统都同样容易优化。让我们考虑一种更浅的体系结构及其更深层次的架构,它增加了更多的层。 对于更深的模型,这有一种通过构建的解决方案:恒等映射(identity mapping)来构建增加的层,其它层直接从浅层模型中复制而来。该解的存在性表明,更深层次的模型不应比较浅的模型产生更高的训练误差。 但是实验表明,我们目前无法找到一个与这种构建的解决方案相当或者更好的方案(或者说无法在可行的时间内实现)。

在本文中,我们通过引入深度残差学习框架( a deep residual learning framework )来解决退化问题。我们不是希望每个层叠层直接拟合所需的底层映射(desired underlying mapping),而是显式地让这些层拟合一个残差映射(residual mapping)。 假设所需的底层映射为 H(x),我们让堆叠的非线性层来拟合另一个映射: F(x):=H(x)−x。 因此原来的映射转化为:F(x)+x。我们假设优化残差映射比优化原始的未参考的映射容易。在极端情况下,如果恒等映射是最优的,则将残差推至零比用一堆非线性层拟合恒等映射更容易。

公式 F(x)+x 可以通过前馈神经网络( feedforward neural networks )的“快捷连接(shortcut connections)”来实现(图2)。捷径连接[2,34,49]是跳过一个或多个层的连接。在本例中,快捷连接只执行恒等映射,它们的输出被添加到叠加层的输出中(图2)。恒等捷径连接既不增加额外的参数,也不增加计算的复杂性。整个网络仍然可以使用反向传播的SGD进行端到端的训练,并且可以使用公共库(例如caffe[19])来实现,而无需修改求解器( solvers)。

我们在ImageNet[36]上进行了综合实验,以说明退化问题并对我们的方法进行评估。结果表明:1)我们的极深残差网络易于优化,但对应的“朴素”网(即简单的层叠层)随着深度的增加,训练误差较大;2)我们的深层残差网可以很容易地从深度的大幅度增加中获得精度增益,比以前的网络产生的结果要好得多。

CIFAR-10数据集上也出现了类似的现象,这表明了我们提出的方法的优化难度和效果并不仅仅是对于一个特定数据集而言的。我们在这个数据集上展示了经过成功训练的100层以上的模型,并探索了1000层以上的模型。

在ImageNet分类集[36]上,我们利用极深的残差网得到了很好的结果。我们的152层剩余网是迄今为止在ImageNet上出现的最深的网络,但其复杂度仍然低于vgg网[41]。我们的组合在ImageNet测试集上有3.57%的前5错误( top-5 error),并在ILSVRC 2015分类竞赛中获得了第一名。他在其他识别任务上也有很好的泛化能力,使我们在ILSVRC中的图像网络检测、图像网络定位、coco检测和coco分割方面获得了第一名。这一强有力的证据表明,残差学习原理是通用的,我们期望它适用于其他视觉和非视觉问题。

 

2. Related Work

Residual representations. 残差表示。在图像识别中,VLAD[18]是用残差向量对字典进行编码的表示,Fisher向量[30]可以表示为VLAD的概率版本[18]。两者都是图像检索和分类的有力表示法[4,48]。对于矢量量化,编码剩余向量[17]比编码原始矢量更有效.

在低水平视觉和计算机图形学中,对于求解偏微分方程(PDEs),广泛使用的多重网格方法[3]在多尺度上将系统重新定义为子问题,其中每个子问题负责较粗和较细尺度之间的残差解( residual solution )。多重网格的另一种选择是分层基预处理( hierarchical basis preconditioning)[45,46],它依赖于在两个尺度之间表示残差向量的变量。[3,45,46]已证明这些求解器比不知道解的残差性质的标准求解器收敛得快得多。这些方法表明,一个好的配方或预处理可以简化优化。

Shortcut Connections. 捷径连接[2, 34, 49] 已经经过了很长的一段实践和理论研究过程。一个训练多层感知器(MLPs)的早期实践是添加一个线性层,从网络输入连接到输出[34,49]。在[44,24]中,一些中间层直接连接到辅助分类器,用于解决消失/爆炸梯度(的问题)。[39,38,31,47]的论文提出了用捷径连接实现集中层响应、梯度和传播误差的方法。在[44]中,“Inception”层是由一个捷径分支和几个更深的分支组成的。GooLeNet

与此同时,“ 高速网“(”highway networks”)[42,43]将捷 径连接与门控函数[15]结合起来。这些门依赖于数据,并且有参数,而我们的恒等快捷连接( identity shortcuts )是无参数的。当门控捷径“关闭”(接近于零)时,公路网中的层表示非残差函数。相反,我们的公式总是学习残差函数;我们的恒等快捷连接永远不会关闭,所有信息都会被传递出去,而附加的残差函数将被学习。此外,高速网络在深度极深(例如,超过100层)的情况下,没有表现出精确性的提高。

 

3. Deep Residual Learning

3.1 Residual learning

让H(x)作为一个被少量堆叠层拟合的低端映射(不必加入网络), x指示对于第一层的输入. 如果假设多重非线性层可以假设近似于一个复杂的函数,那么这个假设等价于他们近似于残差函数, H(x)-x. (假设输入输出维度相同) . 所以与其期望堆叠层近似H(x), 我们明确的让这些层去近似于一个残差函数F(x):=H(x)-x. 原始函数是F(x)+x. 虽然这两种形式都应该能够渐近地近似于所期望的函数(假设),但学习的容易程度可能是不同的。

这一重新表述的动机是关于退化问题的违反直觉的现象。就像我们introduction里介绍的, 如果添加的层可以构造为恒等映射, 一个更深的网络的训练错误率应该不大于它对应的浅层网络.退化问题表明求解者可能在通过多个非线性层逼近等价映射方面有困难。利用残差学习重构,如果恒等映射是最优的,则求解者可以简单地将多个非线性层的权值推向零,以逼近恒等映射。

在实际情况下,恒等映射不太可能是最优的,但是我们的重新表达对于这个问题的预处理是有帮助的。如果最优函数更接近于恒等映射而不是零映射,则求解者应该更容易找到与恒等映射有关的扰动(perturbations),而不是将其作为新的扰动来学习。我们通过实验(图7)证明了学习的残差函数一般都有较小的响应,说明恒等映射提供了合理的预条件。

3.2. Identity Mapping by Shortcuts

我们对每几个层叠的层次采用残差学习。图2中展示出了一个积木块(building block )。形式上,在本文中,我们考虑了一个积木块被定义为:

 

这里x和y是考虑的层的输入和输出向量。函数表示要学习的残差映射。 图2中的例子包含两层,

,其中σ代表ReLU,为了简化省略了偏置项。F+x操作由一个快捷连接和元素级(element-wise)的加法来表示。在加法之后我们再执行另一个非线性操作(例如, σ(y)σ(y),如图2)。 

Eq.1中的shortcut连接没有增加额外的参数和计算复杂度。这不仅在实践中很有吸引力,而且在我们比较普通网络和残差网络时也很重要。 我们可以在参数、深度、宽度以及计算成本都相同的基础上对两个网络进行公平的比较(除了可以忽略不计的元素级的加法)。

在eqn.(1)中,x和F的维数必须相等。如果情况并非如此(例如,在更改输入/输出通道时),我们可以通过快捷连接执行线性投影W s ,以匹配维度:

我们还可以在eqn(1)中使用方阵Ws。但是,我们将通过实验证明,恒等映射对于解决退化问题是足够的,而且是经济的,因此只有在匹配维数时才使用Ws。

 残差函数F的形式是灵活的。本文的实验涉及一个函数F,它有两个或三个层(图5),然而它可能有更多的层。但如果F只有一个单层,则eqn.(1)类似于线性层:y=w1x+x,对此我们没有发现任何优势。

我们还注意到,虽然为了简单起见,上述表示法是关于全连通层的,但它们适用于卷积层。函数F(x,{wi})可以表示多个卷积层.元素级加法是在两个特征映射上相应通道上执行的。

3.3. Network Architectures

我们测试了各种普通/残差网络,并观察到一致的现象。为了提供讨论的实例,我们对ImageNet的两个模型进行了如下描述。

Plain Network. 我们的灵感主要来源于VGGnet的思想. 卷积层多是3X3的滤波器, 并且有如下两个规则: 1对于相同的输入特征图大小, 这些层有相同数量的滤波器, 2如果特征映射大小减半,则滤波器的数值加倍,以保留每个层的时间复杂度相同。我们直接用步长为2的卷积层进行下采样。网络以一个全局平均池层和一个带有Softmax的1000路全连接层结束。在图3(中),有权值的层的总数为34 。值得注意的是,与vgg网[41](图3,左)相比,我们的模型具有更少的滤波器和更低的复杂度。我们的34层基线(baseline)有36亿FLOPs乘加),仅为VGG-19(196亿FLOPs)的18%。

Residual Network. 基于之上的网络, 我们插入捷径连接, 从而转变它对应的残差网络版本. 当输入输出有相同的维度等价的捷径是可以直接用的. 当维度增加, 我们可以考虑两种选择:1继续执行等价的映射, 额外的0填充到增加的维度. 这个选项没有额外的参数. 2投影快捷键通过1X1的卷积去匹配维度. 对于这两个选项,当shortcut跨越两种尺寸的特征图时,均使用stride为2的卷积。

3.4. Implementation

我们对ImageNet的实现遵循了[21,41]中的做法。 调整图像的大小使它的短边长度随机的从[256,480] 中采样来进行尺寸扩展( scale augmentation)[41]。 从图像或其水平翻转中随机抽取224×224 crop,并减去每个像素平均(the per-pixel mean)[21]。使用了[21]中的标准颜色增强。我们遵循[16],在每次卷积之后,在激活之前采用批归一化(BN)[16]。我们像[13]一样初始化权重,从零开始训练所有plain/残差网。我们使用小批量大小为256的SGD。学习速率从0.1开始,当误差稳定时除以10,并且 整个模型进行60∗10^4次迭代训练。我们使用的权重衰减为0.0001,动量为0.9。我们不使用Dropout[14],按照[16]的做法。

在测试中,为了进行比较,我们采取标准的10-crop测试。 为了取得最好的效果,我们采用了[41,13]中的全卷积形式,并且在多尺度上平均分数(图像被调整大小,使较短的一面为{224,256,386,480,640})。

 

4. Experiments

4.1. ImageNet Classification

我们在ImageNet 2012分类数据集[36]上评估了我们的方法,该数据集包含1000个类。模型在128万张训练图像上进行了巽寮,在50k验证图像上进行了评估。我们还获得了测试服务器报告的100 k张测试图像的最终结果。我们评估了前1位和前5位的错误率(top-1 and top-5 error rates)。

Plain NetWork. 我们首先评估18层和34层普通网。34层普通网在图3(中)。18层普通网具有类似的形式.详细的体系结构见表1。

表2的结果展示了34层网络比18层的网络有更高的错误率. 解释原因, 在图4中我们对比在训练期间训练和验证的错误率. 我们观察到退化的问题--34层普通网络有更高的训练错误率在整个训练过程期间, 即使18层的网络是34层网络的一个子空间.

我们认为这个困难的最优化不是梯度消散导致的. 这些普通网络是通过BN训练, 所以无论向前还是向后信号都不会消失。事实上,34层普通网仍然能够达到具有竞争力的精度(表3),这表明求解器在某种程度上可以工作。我们推测深普通网可能具有指数级别的低收敛速度,从而影响训练误差的减小【3--我们已经试验了更多的训练迭代(3×),并仍然观察到退化问题,这表明这个问题不可能通过简单地使用更多的迭代来解决】。这种优化困难的原因将在今后进行研究。

 

Residual Networks. 接下来我们评估18层和34层残量网络. 基础结构和普通网络相似, 除了每对3X3的网络增加了一个捷径连接.第一个对比(图片4的右面和表2), 我们使用等价映射对于全部的捷径和0填充去增加维度. 所以他们相对于普通网络没有额外的参数.

我们主要观察到了三点问题. 首先, 情况反转了:32层的表现要比18层的好. 更重要的是, 34层ResNet的训练误差要小得多,并且可以推广到验证数据.这表明,在这种情况下,退化问题得到了很好的解决,并且我们设法从增加的深度中获得了精度增益。

 

第二,与普通的对应网络相比,34层ResNet使Top-1误差减少了3.5%(表2),这是成功地减少了训练误差(图2)的结果(图4右 VS 左))。这一比较验证了残差学习在极深系统上的有效性。

最后,我们还注意到,18层普通/残差网具有大致相等的精确率(表2),但18层ResNet的收敛速度更快(图4右 VS 左)。当网络“不太深”(比如这里的18层)时,当前的SGD解决程序仍然能够为普通网络找到好的解决方案。在这种情况下,ResNet通过在早期阶段提供更快的收敛速度来简化优化。

Identity vs. Projection Shortcuts(应该就是1X1的卷积去投影). 我们展示了无参数的等价快捷对于训练的帮助, 接下来我们调查投影快捷. 在表3中. 我们对比三个选项:(A) 通过0填充快捷增加维度, 并且所有的快捷参数随机;(B)投影快捷去增加维度, 其余快捷恒等;(C)所有的快捷投影.

表3显示,所有这三个选项都比普通的对应方案要好得多。B比A稍好。我们认为,这是因为A中零填充的维度实际上并没有(使用)残差学习。C比b略好,我们把这归因于许多(13个)投影快捷键引入的额外参数。但是a/b/c之间的小差异表明,投影快捷键对于解决退化问题并不重要。因此,在本文的其余部分中,我们不使用选项c以降低计算/时间复杂度和模型大小。恒等快捷键对于不增加下面介绍的瓶颈架构(bottleneck architectures)的复杂性特别重要。

Deeper Bottleneck Architectures. 接下来我们描述更深的网络对于ImageNet. 由于考虑到我们负担得起的训练时间,我们将积木块(building block)修改为瓶颈设计(bottleneck design)。对于每个残差函数F,我们使用一个由3层组成的堆栈,而不是2层(图5)。这三层分别是1×1、3×3和1×1卷积,其中1×1层负责减小然后增加(恢复)维数,使3×3层成为输入/输出维数较小的瓶颈。图5给出了一个例子,其中两种设计都具有相似的时间复杂度。

无参数的恒等快捷键对于瓶颈架构尤其重要。如果是图5(右)中的同恒等快捷键用投影快捷键代替,可以看出时间复杂度和模型大小加倍,因为快捷方式连接到两个高维端点。因此,恒等快捷键为瓶颈设计提供了更有效的模型。

 

50-layer ResNet: 我们将34层网络中的每个2层块替换为这个3层瓶颈块,从而形成一个50层ResNet(表1).我们使用选项B来增加维度。这种模式有38亿次FLOPs。

 

101-layer and 152-layer ResNets: 我们使用更多的三层块来构造101层和152层的ResNet(表1).值得注意的是,虽然深度明显增加,但152层 ResNet((113亿次 FLOPs)的复杂性仍然低于vgg-16/19网(153/196亿次 FLOPs)。

50/101/152层ResNet比34层网有相当大程度的准确率提升(表3和表4)。我们没有观察到退化的问题,因此,我们可以享受从大大增加的深度中获得的显著的精确性。所有评价指标都能看到深度的好处(表3和表4)。

 

Comparisons with State-of-the-art Methods. 在表4中,我们将与之前最好的单模型结果进行比较。我们的基线34层ResNet已经达到了非常竞争的准确性。我们的152层 ResNet的单模型Top-5验证误差为4.49%。这个单一模型的结果优于所有以前的集成结果(表5)。我们将六个不同深度的模型组合成一个整体(在提交时只有两个152层网络)。这将得到了测试集上3.57%的Top-5错误(表5).这一项目获得了2015年ILSVRC的第一名。

 

4.2. CIFAR-10 and Analysis(CIFAR-10和分析)

我们在CIFAR-10数据集[20]进行了更多的研究,该数据集包括50个训练图像和10个类别的10k测试图像。我们在训练集上进行了实验训练,并在测试集上进行了评估。我们的重点是极深网络的行为,而不是推进最先进的结果,所以我们故意使用简单的架构如下。

普通/残差结构遵循图3(中/右)中的形式。网络输入32×32图像,每像素被减去每像素平均( with the per-pixel mean subtracted)。第一层为3×3卷积层。然后,我们在尺寸为{32,16,8}的特征映射上分别使用3×3卷积的共6n层叠加,每个特征地图大小都有2n层。滤波数分别为{16,32,64}。下采样是以2的步长的卷积来执行的。网络以全局平均池、10路全连接层和softmax为结束。共有6n+2层加权层。下表概述了该体系结构:

当使用快捷连接时,它们被连接到3×3层的对上(总共3n条捷径)。在这个数据集中,我们在所有情况下都使用恒等快捷键(即选项A),因此,我们的残差模型的深度、宽度和参数与对应的普通模型完全相同。

我们使用权重衰减为0.0001,动量为0.9,采用了在[13]中的权值初始化在[13]和bn[16],但没有使用Dropout。这些模型是在两个GPU上训练的,小批量大小为128。我们的学习速度为0.1,在第32K和48K次迭代时除以10,在64k迭代时终止训练,这是由45k/5k训练/验证的分割决定。我们按照[24]中的简单数据增强进行训练:每边填充4个像素,从填充图像或水平翻转中随机抽取32×32帧。对于测试,我们只评估原始32×32图像的单一图像。

我们比较n={3,5,7,9},从而形成的20,32,44和56层网络。图6(左)显示了普通网的行为。深普通网随着深度增大,深度训练误差较大。这个现象类似于ImageNet(图4左)和mnist(见[42])上的现象,这表明这种优化困难是一个基本问题。

图6(中间)显示了残差网的行为。类似于ImageNet的案例(图4,右),当深度增加时,我们的残差网也设法克服了优化的困难,并提高了精度。

我们进一步探索了当n=18时获得的110层ResNet。在这种情况下,我们发现初始学习速率0.1太大,以致无法开始收敛。因此,我们使用0.01的学习速率为训练热身,直到训练误差小于80%(约400次迭代),然后将学习速率改为0.1继续训练。学习计划的其余部分和以前一样。这个110层网络能够很好地收敛(图6, 中)。它的参数比 FitNet[35]和 Highway[42](表6)等其他深而瘦的网络少,但却是最先进的结果之一(6.43%,表6)。

图6、在CIFAR-10上的训练。虚线表示训练错误,粗体线表示测试错误。左:普通网络。普通-110的误差大于60%,不显示。中间:残差网。右:有110层和1202层的残差网。

表6、CIFAR-10测试集的分类错误。所有方式都有数据增强。对于ResNet-110,我们运行5次,显示“最佳(平均±STD)”,如[43]中。

Analysis of Layer Responses. 。图7显示层响应的标准差(std)。响应为每个3×3层的输出,它在BN之后,在其它非线性(relu/加法)之前。对于ResNet,本分析揭示了残差函数的响应强度。图7表明残差网的响应一般比普通网的小。这些结果支持了我们的基本动机(第3.1节),即残差函数一般比非残差函数更接近于零。我们还注意到,较深的ResNet的响应幅度较小,如图7中ResNet-20、56和110之间的比较所示。当有更多的层时,单个的一层残差网倾向于对信号进行较少的修改。

Exploring Over 1000 layers。我们探索了一个超过1000层的深度模型。我们设置n=200得到1202层网络,该网络就像上面所描述的那样被训练。我们的方法不存在优化困难,该1000层网络的训练误差小于0.1%(图6,右)。它的测试误差仍然相当好(7.93%,表6)

在这些激进的深层次模型上,仍存在一些有待解决的问题。这个1202层网络的测试结果比我们的110层网络差,尽管两者都有相似的训练误差。我们认为这是因为过拟合。对于这个小数据集,1202层网络可能不必要地大(19.4M)。在此数据集使用强正则化,如maxout[10]或dropout[14],可以获得最佳结果([10,25,24,35]。但在本文中,我们使用的是无 maxout/无漏的方法,只需通过深而瘦的结构设计来实现正则化,而不分散对优化的困难的关注。但是,与更强的正则化相结合可以提高结果,这是我们今后研究的方向。

 

4.3. Object Detection on PASCAL and MS COCO(在PASCAL和MS COCO上的目标检测)

该方法对其它识别任务具有较好的泛化性能。表7和表8显示了PASCAL VOC 2007 and 2012[5]和COCO[26]的目标检测基线结果。我们采用Faster R-CNN[32]作为检测方法。在这里,我们对用ResNet-101替换VGG-16[41]的改进感兴趣。使用这两种模型的检测实现(见附录)是相同的,因此收益只能归功于更好的网络。最值得注意的是,在具有挑战性的coco数据集上,我们得到了coco标准度量的6.0%的增长(map@[.5,.95]),,这是一个28%的相对改进。这一收益完全归功于所学习的表述(learned representations)。

基于深度剩余网,我们在ILSVRC的几个项目中获得了第一名:Imagenet检测,ImageNet定位,coco检测和coco分割。详情见附录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TWSF

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

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

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

打赏作者

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

抵扣说明:

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

余额充值