Densely Connected Convolutional Networks(文献阅读笔记)

摘要
最近的研究表明,如果卷积网络在靠近输入的层和靠近输出的层之间包含较短的连接,那么它的训练就可以更深入、更准确、更有效
在本文中,我们相信这一观察,并引入了Dense Convolutional Network(DenseNet),它以前馈方式将每一层连接到每一层。传统的卷积网络有L层L个连接-在每层与其后续层之间有,而我们的网络有 L ( L + 1 ) / 2 L(L+1) /2 L(L+1)/2个直接连接。
对于每一层,前面所有层的特征图被用作输入,它自己的特征图被用作所有后续层的输入。DenseNets有几个引人注目的优点:它们缓解了消失梯度问题,加强了特征的传播,鼓励特征的重用,并大大减少了参数的数量。我们在四个高度竞争的目标识别基准任务(CIFAR-10、CIFAR-100、SVHN和ImageNet)上评估我们提出的架构。DenseNets获得显著的改进,其超过大多数目前性能最强的卷积神经网络模型,同时需要较少的计算以实现高性能。

1.引言

卷积神经网络(CNNs)已经成为视觉对象识别的主要机器学习方法。虽然早在20年前就已经开始使用了,但是计算机硬件和网络结构的改进直到最近才使真正的深度CNNs的训练成为可能。最初的LeNet5由5层组成,VGG是19,就在去年,Highway Networks和Residual Networks (ResNets)已经超过了100层。
随着CNNs网络的不断加深,一个新的研究问题出现了:当有关输入或梯度的信息经过许多层时,当它到达网络的末端(或开始)时,可能会消失或被冲刷掉。许多最近的神经网络模型解决了这个相关的问题。ResNets和Highway Networks 通过身份连接将信号从一层旁路到另一层。。随机深度通过在训练过程中随机降低层数,以提供更好的信息和梯度流,缩短了ResNets。FractalNets反复将几个并行层序列与不同数量的卷积块组合在一起,以获得较大的标称深度,同时保持网络中的许多短路径。尽管这些不同的方法在网络拓扑和训练过程上各不相同,但它们都有一个关键特质**:从早期层到后期层都创建了较短的路径**。
在本文中,我们提出了一种架构,将这种见解提炼为一种简单的连通性模式:为了确保网络中各层之间的信息流最大化,我们将所有层(具有匹配的feature-map大小)直接相互连接。为了保持前馈特性,每一层从前面的所有层获得额外的输入,并将自己的特征图传递给后面的所有层。图1简要地说明了这种布局。至关重要的是,与ResNets不同的是,我们从不在它们进入一个层之前通过求和将它们组合起来;相反,我们通过连接特性来组合它们。因此,第 l l l层有 l l l个输入,包括所有前面卷积块的特征图。它自己的特性映射被传递到随后的所有层。这将在 L L L层网络中引入 L ( L + 1 ) 2 L(L+1) 2 L(L+1)2连接,而不是像传统架构中那样只引入 L L L连接。由于其稠密的连通性模式,我们将我们的方法称为Dense Convolutional Network(DenseNet)。
在这里插入图片描述
这种密集连接模式的一个可能与直觉相反的影响是,它需要比传统卷积网络更少的参数,因为不需要重新学习冗余的特征图。传统的前馈结构可以看作是一种具有state的算法,state是一层传递到另一层的。每一层从它的前一层读取state并写入到下一层。它改变了state,但也传递了需要保存的信息。ResNets通过附加的恒等转换使这个信息发布显式。最近ResNets的变化表明,许多层贡献很小,实际上可以在训练期间随机dropped。这使得ResNets的状态类似于(展开的)递归神经网络,但ResNets的参数数量实质上更大,因为每一层都有自己的权值。我们提出的DenseNet架构明确区分了添加到网络中的信息和保存的信息。DenseNet层非常狭窄(例如,每层12个filters),只向网络的 collective knowledge 中添加一小组特征图,并保持其余的特征图不变,最终的分类器根据网络中的所有特征图进行决策。
除了更好的参数效率之外,DenseNets的一大优势是其改进的信息流和网络中的梯度,这使得它们易于训练。每一层都可以直接从损失函数和原始输入信号得到梯度,从而形成一个隐式的深度监管。这有助于训练更深层次的网络架构。此外,我们还观察到,密集的连接具有正则化效果,这可以减少较小训练集上的过拟合。
我们在四个高度竞争的基准数据集(CIFAR-10、CIFAR-100、SVHN和ImageNet)上评估了DenseNets。我们的模型往往需要比现有算法更少的参数,但精确度相当。此外,我们在大多数基准测试任务上的表现都超过了目前的最高水平。

2. 相关工作

自神经网络最初被发现以来,对网络架构的探索一直是神经网络研究的一部分。最近神经网络的兴起也使这个研究领域重新活跃起来。现代网络中不断增加的层数放大了架构之间的差异,激发了对不同连接模式的探索和对旧研究理念的重新审视。
类似于我们提出的密集网络布局的级联结构在80年代的神经网络文献中已经被研究过了。他们的开创性工作集中在完全连接的多层感知器上以逐层方式训练。最近,用批量梯度下降法训练的全连接级联网络被提出了。尽管这种方法在小型数据集上很有效,但它只适用于只有几百个参数的网络。通过 skip-connnections利用CNNs中的multi-level features对各种视觉任务是有效的。与我们的工作并行的是,派生了一个纯理论的跨层连接网络框架,与我们的类似。
Highway Networks是第一个提供了一种方法来有效地训练超过100层的端到端网络的架构之一。使用旁路和门控单元,数百层的Highway Networks可以优化没有困难。旁路被认为是减轻这些深度网络训练的关键因素。这一点进一步由ResNets[11]支持可得到,其中纯身份映射被用作旁路。ResNets在许多具有挑战性的图像识别、定位和检测任务上取得了令人印象深刻的、破纪录的表现,如ImageNet和COCO目标检测[11]。最近,人们提出了一种训练1202层ResNet[13]的方法。随机深度通过在训练过程中随机地减少层数来改进深度 residual networks 的训练。这表明并不是所有的层可能都是必要的,并强调在 deep (residual) networks.有大量的冗余。我们的论文部分受到了这一观察的启发。具有预激活功能的ResNets还有助于训练最先进的超过1000层的网络。
一种使网络更深入的正交方法(在跳过连接的帮助下)是增加网络宽度。GoogLeNet[36,37]使用了一个“Inception模块”,它将由不同大小的filter产生的feature-maps连接起来。ResNets的一种变种提出了广义残差块的概念。实际上,在深度足够大的情况下,简单地增加ReaNets的每层过滤器的数量可以提高其性能,FractalNets也在几个数据集上使用一个宽网络结构取得了有竞争力的结果。
DenseNets不是从极深或极广的架构中提取代表性的力量,而是通过特性重用来开发网络的潜力,产生易于训练和高度参数效率的浓缩模型。将不同层学习到的特征图连接起来,会增加后续层输入的差异,提高效率。这是DenseNets和ResNets之间的主要区别。与Inception网络相比,DenseNets网络更简单,效率更高。
还有其他显著的网络架构创新已经产生了竞争性的结果。Network in Network (NIN)将微型多层感知器加入到convolutional layer的filter中,以提取更复杂的feature。在Deeply Supervised Network (DSN)中,辅助分类器直接对内部层进行监督,增强了早期层接收到的梯度。Ladder Networks为自动编码器引入了横向连接,在半监督的学习任务中产生了令人印象深刻的准确性。Deeply-Fused Nets (DFNs)通过结合不同基础网络的中间层来改善信息流。增强具有最小化重建损失的路径的网络也可以改善图像分类模型。

3.DenseNets
考虑通过卷积网络的单个图像 x 0 x_0 x0。该网络包括 L L L个层,每个层实现一个非线性转换 H l ( . ) H_l(.) Hl(.),其中 l l l表示第 l l l层。 H l ( . ) H_l(.) Hl(.)可以是诸如批处理标准化(BN)、整流线性单元[ReLU]、池化或卷积(Conv)等操作的复合函数。我们将第 l l l层的输出表示为 x l x_l xl

ResNets
传统的卷积前馈网络将第 l l l层的输出作为第 ( l + 1 ) (l+1) (l+1)层的输入,产生如下的层转换: x l = H l ( x l − 1 ) x _l = H _l (x _{l−1}) xl=Hl(xl1)。ResNets添加一个skip-connection ,绕过非线性转换与恒等函数:
x l = H l ( x l − 1 ) + x l − 1 x_l=H_l(x_{l-1})+x_{l-1} xl=Hl(xl1)+xl1 (1)
ResNets的一个优点是梯度可以直接通过恒等函数从较晚的层流到较早的层。但是,恒等函数与 H l H _l Hl的输出被求和合并,可能会阻碍网络中的信息流。
Dense connectivity
为了进一步改善层之间的信息流,我们提出了一种不同的连接模式:我们引入从任何层到所有后续层的直接连接。图1简要地说明了DenseNet的布局。因此,第 l l l个层接收到之前所有层的特征图, x 0 , … , x l − 1 x_0,…, x _{l-1} x0xl1,作为输入:
x l = H l ( [ x 0 , x 1 , . . . , x l − 1 ] ) x_l=H_l([x_0,x_1,...,x_l-1]) xl=Hl([x0,x1,...,xl1]) (2)

其中 [ x 0 , x 1 , … , x l − 1 ] [x_0, x_1,…, x _{l-1}] [x0,x1xl1]指的是在0到 l − 1 l-1 l1层生成的特征图的连接。由于其密集的连通性,我们将这种网络结构称为稠密卷积网络(DenseNet)。为了便于实现,我们将等式(2)中 H l ( ⋅ ) H_l (·) Hl()的多个输入连接成一个张量。
Composite function
我们认为 H l ( ⋅ ) H_l (·) Hl()是三个连续操作的复合函数:批处理归一化(BN),然后是一个整流的线性单元(ReLU)和一个3×3卷积(Conv)。
Pooling layers
等式(2)中的连接操作使用了在feature-maps大小变化时不可行。然而,卷积网络的一个重要部分是向下采样层,从而改变特征图的大小。为了在我们的架构中方便向下采样,我们将网络划分为多个紧密连接的密集块;参见图2。我们把块之间的层称为过渡层,它负责卷积和池化。我们实验中使用的过渡层包括一个批处理归一层和一个1×1的卷积层,然后是一个2×2的平均池化层。
在这里插入图片描述
Growth rate
如果每个函数 H l ( ⋅ ) H_l (·) Hl()产生 k k k个feature maps,则第 l l l k 0 + k × ( l − 1 ) k_0+k×(l-1) k0+k×(l1)输入feature-map,其中 k 0 k_0 k0为input层的通道数。现有的DenseNet网络架构之间的一个重要区别是DenseNet可以有非常窄的层,例如k = 12。我们将超参数k作为网络的增长率。我们在第4节中表明,相对较小的增长率就足以在我们测试的数据集上获得最先进的结果。对此的一种解释是,每一层都可以访问其块中的所有前面的特征图,因此,可以访问网络的“collective knowledge”。人们可以把特征图看作是网络的全局状态。每一层都将自己的k个特征图添加到这个状态中。增长率调节了每一层向全局状态贡献的新信息的数量。一旦编写好全局状态,就可以从网络的任何地方访问它,而且不像在传统网络架构中那样,不需要逐层复制它。
Bottleneck layers
虽然每一层只产生k个输出特征图,但它通常有更多的输入。可以在每个3 × 3卷积之前引入一个1 ×1卷积作为Bottleneck layers,以减少输入特征图的数量,从而提高计算效率。我们发现这种设计对DenseNet特别有效,因此我们在使用这种瓶颈层的网络时,即 B N − R e L U − C o n v ( 1 × 1 ) − B N − R e L U − C o n v ( 3 × 3 ) BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) BNReLUConv(1×1)BNReLUConv(3×3),即DenseNet-B。在我们的实验中,我们让每个1×1卷积产生4k feature-maps。
Compression
为了进一步提高模型的紧凑性,我们可以减少过渡层的特征图数量。如果一个稠密的块包含m张feature-map,我们让下面的过渡层生成 Θ m \Theta _{m} Θm个输出feature-map,其中 0 < Θ ≤ 1 0< \Theta \leq 1 0<Θ1为压缩因子。当取值为1时,过渡层间特征图数量不变。我们将$ \Theta \leq 1$的DenseNet称为DenseNet- c,在我们的实验中,我们设 Θ = 0.5 \Theta=0.5 Θ=0.5 。当使用的瓶颈层和过渡层的 Θ \Theta Θ 小于1时,我们将我们的模型称为DenseNet-BC。
Implementation Details
在除ImageNet外的所有数据集上,我们实验中使用的DenseNet有三个密集的块,每个块都有相同数量的层。在进入第一个稠密块之前,对输入图像进行有16个输出通道(或DenseNet-BC增长率的两倍)的卷积。对于kernel size为3×3的convolutional layer,输入的每边都通过补零一个像素来保持特征图的大小。我们使用1×1卷积和2×2平均池化作为两个相邻密集块之间的过渡层。在最后一个稠密块的末尾,执行一个全局平均池,然后附加一个softmax分类器。三个密集块的feature map尺寸分别为32×32、16×16和8×8。我们实验了基本的DenseNet结构:{L = 40, k = 12}, {L =100, k = 12}和{L =100, k = 24}。对于DenseNet-BC,计算配置为 {L= 100, k= 12},{L=250, k=24},{L= 190, k=40}的网络。
在我们的ImageNet实验中,我们使用了一个DenseNet-BC结构,它有4个密集的块,在224×224的输入图像上。初始卷积层包括大小为7×7的2k卷积,步幅 为2;所有其他层中的feature-map的数量也遵循k的设置。表1显示了我们在ImageNet上使用的确切网络一致性。
在这里插入图片描述
4. Experiments
我们通过实验证明了DenseNet在几个基准数据集上的有效性,并与目前最先进的架构,特别是ResNet及其变体进行了比较。
4.1 Datasets
CIFAR.
两个CIFAR数据集由32×32像素的彩色自然图像组成。CIFAR-10 (C10)由来自10和来自100类的CIFAR-100 (C100)的图像组成。训练集和测试集分别包含50,000张图像和10,000张图像,我们持有5,000张训练图像作为验证集。我们采用这两个数据集广泛使用的标准数据增强方案(mirroring/shift)。我们在数据集名称的末尾用一个“+”标记(例如,C10+)表示这个数据扩充方案。对于预处理,我们使用通道平均值和标准差对数据进行归一化。对于最后的运行,我们使用所有50,000张训练图像,并在训练结束时报告最终的测试错误。
SVHN.
街景门牌号(SVHN)数据集包含尺寸为32×32彩色数字图像。训练集中有73,257张图像,测试集中有26,032张图像,需要进行额外训练的图像有531,131张。按照惯例,我们使用所有的训练数据,不进行任何数据扩充,从训练集中分离出一个6000张图像的验证集。我们在训练中选择验证误差最小的模型,报告测试误差。我们遵循并将像素值除以255,因此它们在[0,1]范围内。
ImageNet
ILSVRC 2012分类数据集包括120万张用于训练的图像,以及来自1000个类的5万张用于验证的图像。对于训练图像,我们采用与文献[8,11,12]相同的数据增强方案,在测试时采用单次裁剪或10次裁剪,尺寸为224×224。文献[11,12,13],我们报告了验证集上的分类错误。

4.2 Training
所有的网络都使用随机梯度下降(SGD)进行训练。在CIFAR和SVHN上,我们分别使用batch size为64进行300和40个epoch的训练。初始学习率设置为0.1,然后除以10在epochs分别为训练总次数的50%和75%时。在ImageNet上,我们训练了90个epoch的模型,batch size为256。初始学习率设置为0.1,在epoch为30和60时降低了10倍。注意,naive DenseNet实现可能内存不足。为了减少gpu上的内存消耗,请参考我们关于内存效应的DenseNets实现的技术报告。
接下来,我们使用 1 0 − 4 10^{-4} 104的 weight decay和不带dampening的Nesterov动量为0.9。我们采用引入的权重初始化在文献[10]中。对于没有数据扩充的三个数据集,即C10, C100, SVHN,我们在每个卷积层之后(第一个除外)添加一个dropout层,并将dropout速率设置为0.2。每个任务和模型设置只评估一次测试错误。
4.3. Classification Results on CIFAR and SVHN
我们用不同的深度,L和生长速率k训练densenet。在CIFAR和SVHN上的主要结果如表2所示。为了突出总体趋势,我们用黑体字标记所有优于现有技术的结果,用蓝色表示总体最好的结果。
在这里插入图片描述
准确性
最明显的趋势可能来自表2的最下面一行,它显示L = 190和k = 40的DenseNet-BC在所有CIFAR数据集中始终优于现有的最先进技术。它在C10+上的错误率为3.46%,在C100+上的错误率为17.18%,明显低于宽ResNet架构的错误率。我们在C10和C100上的最佳结果(没有数据增加)甚至更令人鼓舞:两者的错误率都比使用drop-path regularization的fractalnet低近30%。在SVHN上,有dropout, L = 100和k = 24的DenseNet也超过了目前宽ResNet取得的最佳结果。然而,250层的DenseNet-BC并没有比更短的版本进一步提高性能。这可能是由于SVHN是一个相对简单的任务,而深度极深的模型可能会对训练集过度。
Capacity.
在没有压缩或瓶颈层的情况下,随着L和k的增加,DenseNets的表现一般会更好。我们将其主要归因于模型容量的相应增长。C10+和C100+的列可以很好地说明这一点。 在C10+上,随着参数从1.0M增加到超过7.0M增加到272M,误差从5.24%下降到4.10%,逐渐下降到3.74%。在C100+上,我们观察到了类似的趋势。这表明densenet可以利用更大更深入的模型所增加的代表性力量。它还表明,它们不存在过度拟合或residual networks的优化困难。
参数效率
表2中的结果表明DenseNets比其他架构(特别是ResNets)更有效地利用参数。在过渡层具有瓶颈结构和降维的DenseNetBC具有特别的参数效应。例如,我们的250层模型只有1530万个参数,但它始终优于其他模型,如FractalNet和Wide ResNets,它们有超过3000万个参数。我们还强调,L = 100和k = 12的DenseNet-BC与的1001层预激活ResNet的性能相当比其少使用90%参数(例如,C10+上的4.51%和4.62%的误差,C100+上的22.27%和22.71%的误差)。图4(右面板)显示了这两个网络在C10+上的训练损失和测试错误。1001层的深层ResNet收敛于一个较低的训练损失值,但测试错误类似。下面我们将更详细地分析这种影响。
在这里插入图片描述
Overfitting.
更有效地使用参数的一个积极的副作用是DenseNets不太容易过度拟合。我们观察到,在没有数据扩充的数据集上,它们对数据体系结构的改进尤其明显。在C10上,改进表明误差从7.33%相对减少了29%至5.19%。在C100上,从28.20%下降到19.64%,降幅约为30%。在我们的实验中,我们观察到在单次设置中可能存在的过度拟合:当k=12增加到k=24时,a4×参数的增长导致误差从5.77%适度增加到5.83%。DenseNet BC瓶颈层和压缩层似乎是对抗这一趋势的有效方法。
4.4. Classification Results on ImageNet
我们在ImageNet分类任务中评估了不同深度和增长率的DenseNet BC,并将其与最新的ResNet架构进行了比较。为了确保两种架构之间的公平比较,我们通过采用公开提供的Torch实现ResNet,消除了数据预处理和优化设置方面的差异等所有其他因素。
我们只需将ResNet模型替换为DenseNetBC网络,并保持所有实验设置与ResNet所用的设置完全相同。
我们在表3中报告了ImageNet上DenseNets的单作物和10个裁剪验证错误。图3显示了DenseNets和ResNets的单裁剪top-1验证错误,它是参数数量(左)和触发器数量(右)的函数。图中所示的结果与artResNets的状态一致,同时需要的参数和计算量显著减少,以达到可比的性能。例如,具有20米参数的DenseNet-201模型产生的验证误差与具有40米以上参数的101层ResNet相似。从右面板可以观察到类似的趋势,该面板将验证错误绘制为FLOPs数量的函数:一个DenseNet需要的计算量与resnet-50performsonparwithaResNet-101相同,后者需要的计算量是resnet-50performsonparwithaResNet-101的两倍。
值得注意的是,我们的实验设置意味着我们使用的超参数设置是为ResNets而不是DenseNets优化的。可以想象,更广泛的超参数搜索可以进一步提高DenseNet在ImageNet上的性能。
5. Discussion
从表面上看,DenseNets与ResNets非常相似:**式(2)与式(1)的区别仅仅在于H’(·)的输入是串联的,而不是求和的。**然而,这个看似很小的修改的含义导致两个网络体系结构的行为大不相同。
模型紧凑性
作为输入连接的直接结果,任何DenseNet层学习的特征映射都可以被所有后续层访问。这鼓励在整个网络中重用特性,并导致更紧凑的模型。
图4中的左两个图显示了一个实验的结果,该实验旨在比较所有DenseNets变量(左)的参数效率,以及一个可比的ResNet架构(中)。我们在C10+上训练多个不同深度的小网络,并将其测试精度作为网络参数的函数。与其他流行的网络架构(如AlexNet[16]或VGG net[29])相比,具有预激活的resnet使用更少的参数,同时通常获得更好的结果[12]。因此,我们将DenseNet(k=12)与此架构进行比较。DenseNet的培训设置与上一节中的相同。
结果表明,DenseNet-BC是DenseNet中参数效率最高的变量。此外,为了达到同样的精度水平,DenseNet BC只需要ResNets的1/3左右的参数(中间图)。这个结果与我们在ImageNet上的结果一致,如图3所示。图4中的右图显示,仅具有0.8米可训练参数的DenseNet BC能够达到与具有10.2米参数的1001层(预激活)ResNet相当的精度。
隐性深层监督。对于密集卷积网络的精度改善的一个解释可能是,各个层通过较短的连接从loss function接收额外的监视。人们可以将DenseNets解释为进行一种“深度监督”。深度j监督的好处以前已经在deeply-supervised nets(DSN)中表现出来,该网络将分类器附加到每个隐藏层,强制中间层学习区分特征。DenseNets以一种隐含的方式执行类似的深层监督:网络顶部的单个分类器最多通过两个或三个过渡层向所有层提供直接监控。然而,由于损失函数和梯度在各层之间是相同的,因此损失函数和梯度在本质上是复杂的。
随机与确定性联系
dense convolutional networks与dense convolutional networks正则化之间存在有趣的联系。在随机深度中,剩余网络中的层被随机丢弃,从而产生周围的层之间产生直接连接。由于池化层从未被丢弃,因此网络产生了与DenseNet相似的连接模式:如果所有中间层都被随机丢弃,同一池化层之间的任何两个层都很可能直接连接。尽管这些方法最终是完全不同的,但对随机深度的DenseNet解释可能为这种正则化器的成功提供了见解。

特征重用。
在设计上,DenseNets允许layers从其前面的所以层中产生的特征图(尽管有时通过过渡图层)。我们进行了一个实验来调查一个受过训练的网络是否利用了这个机会。我们首先在C10+上训练DenseNet,L=40,k=12。对于块内的每个卷积层,我们计算分配给与层s连接的平均(绝对)权重。图5显示了所有三个密集块的热图。平均绝对权重用作卷积层对其前几层的依赖性的替代项。位置(’,s)中的红点表示层“平均而言,强烈使用了之前生成的s层特征图。从图中可以观察到以下几点:
6. Conclusion
提出了一种新的卷积网络结构,称为密集卷积网络(DenseNet)。它引入了具有相同特征图大小的任意两个layers之间的直接连接。我们证明了DenseNets可以自然地扩展到数百层,同时不存在优化困难。在我们的实验中,
DenseNets倾向于随着参数数量的增加,在精度上得到一致的提高,没有任何性能下降或过度拟合的迹象。在多种设置下,它在几个高度竞争的数据集上实现了最好的结果。此外,DenseNets需要的参数和计算量大大减少,以实现最先进的性能。由于我们在研究中采用了对残差网络进行优化的超参数设置,我们相信通过更详细地调整超参数和学习速率调度,可以进一步提高densenet的精度。
在遵循简单连接性规则的同时,DenseNets自然地集成了identity mappings, deep supervision, and diversified depth的属性。它们允许在整个网络中重用特征,因此可以学习更紧凑的模型,根据我们的实验,可以学习更精确的模型。由于其紧凑的内部表示和减少的特征冗余,DenseNets可能是各种基于卷积特征的计算机视觉任务的良好特征提取器。我们计划在以后的工作中与DenseNets一起研究这种特征转移。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值