(SENet)Squeeze-and-Excitation Networks论文阅读笔记

SENet是一种卷积神经网络结构,通过Squeeze-and-Excitation blocks动态地对通道间关系进行建模,提升网络表示能力。SE block包括全局信息嵌入(squeeze)和自适应特征重校准(excitation)两步,能够增强模型对关键特征的敏感度。实验证明,SE block在ImageNet、CIFAR、COCO等多个数据集和任务上提高了模型性能,且仅引入少量额外计算成本。
摘要由CSDN通过智能技术生成

(SENet)Squeeze-and-Excitation Networks论文阅读笔记2018

Abstract

CNN的核心building block是卷积操作,它通过融合感受野内的空间以及通道之间的信息,产生了有信息的特征。之前的许多研究已经探索了这种关系的空间成分,试图通过在整个特征层次上提高空间编码的质量来提升网络的表达能力。在本文中,相反,我们聚焦在通道维度的关系上,提出一个全新的结构单元,**我们叫做“Squeeze-and-Excitation”(SE)block,它可以通过对不同通道之间的关系进行建模,自适应地重新校准按通道的特征相应。**我们可以将SEblock堆叠,构成SENet结构,可以在不同的数据集上都非常有效。**我们进一步验证,SE blocks对SOTA的CNN结构可以带来很大的提升,而值引入了一点额外计算花费。**以SENet作为基础网络,我们在ILSVRC2017分类任务上取得了第一名,取得2.251%的top-5错误率,将2016的冠军相对提升25%。

1. Introduction

CNN已经证明在处理一系列视觉任务上都是有效的。在网络的每个卷积层,使用一些卷积核来表示空间邻域中的连通性,**即将感受野范围内空间和不同通道之间的信息融合起来。**通过使用一系列带有非线性激活函数的卷积层以及下采样操作,CNN可以产生具有分层次特征的图像表示,理论上可以获得全局感受野。计算机视觉研究的一个中心策略就是寻找更有表达能力的特征,这些特征对于给定任务有着最好的效果,可以提升任务表现。作为视觉任务中广泛应用的模型,新的神经网络设计已经成为了该领域的新研究热点。最近的研究表明,**CNN产生的表示可以被增强,通过将学习机制集成到网络中来帮助捕获特征之间的空间关系。**Inception就是一种这样的方法,将多种尺度的处理处理集成到模块中,来获得表现提升。之后的工作聚焦于更好地建模空间依赖性,将空间注意力引入到网络结构。

本文中,我们研究网络设计中的一个不同的方向——通道之间的关系。我们引入了一种新的结构单元,叫做Squeeze-and-Excitation (SE) block,**通过对卷积特征通道之间的关系进行建模,来提升表示的质量。**为此,我们提出了一种机制,可以使网络完成特征重新对准,通过这个过程它可以学习使用全局信息来有选择地强调informative的特征,忽视较没用的特征。

SEblock的结构如图1所示:

对于任意变换Ftr,将输入x变成特征图U,U的尺寸为H×W×C,比如卷积操作。**然后对于U,我们首先通过一个挤压操作(squeeze),对每个通道产生一个通道描述子(直接对该通道的H * W进行累加)。**这个描述子函数的作用是,产生一个有着该通道全局信息响应的embedding,**可以将网络全局感受野的信息用到每一层中。这个累加操作是excitation(激励)操作,该激励操作采用简单的自选通机制(self-gating)的形式,将embedding作为输入,输出对每个通道有修正权重的结果。这些权重应用到U上,来生成SEblock的输出,**输出可以直接用到网络的后续层。

可以通过简单的将SE block堆叠来构建SENet。而且,这些blcok可以用作原来网络中某些block替代品。虽然构建模块的模板是通用的,但它在整个网络中在不同深度执行的角色是不同的。在早期卷积层上,它以类无关的方式提取特征,可以增强共享的低等级表示;在后期层中,SEblock可以以class-specific的方式,来增强某一类的表示。

新的CNN结构的设计和发展是一个困难的任务,需要选择很多新的超参数和层的配置。相反,SE block的结构非常简单,可以直接应用到现存的SOTA结构中,直接取代对应的block,网络表现会得到有效提升。SEblock的计算量同样是轻量级的,只会导致网络的复杂度少量增加,计算负担也只增加一点。

为了证明,我们使用几个SENet在ImageNet上进行了实验。我们同样做了实验表示我们方法的优点不只限于特定的任务和数据集。使用SENets,我们在ILSVRC 2017分类竞赛上取得第一名,我们最好的网络达到2.251%的top错误率,比之前的优胜者相对提升了25%。

2. Related Work

Deeper architectures.

VGG和Inception模型展示出,提升网络的深度可以有效提升网络学习到的表示的质量。通过对每一层输入进行正则化,BN对学习过程增加了稳定性,产生了更加平滑的优化曲面。基于这些网络,ResNets证明通过使用identity-mapping跳跃连接可以构建更深更强的网络。Highway网络引入了一个gating机制来regulate信息在shortcut之间的传递。以这些网络为基础,逐渐有了许多不同connnection形式的网络,取得了表现的提升。

另一种方法关注于提升网络中包含的计算形式。分组卷积是一种有效的形式,可以增加学习变换的基数。更加灵活的一些操作有多分支卷积,可以看做是分组操作的一种扩展。在之前的工作中,跨通道的相关性通常被映射为特征的新组合,无论是独立的空间结构还是使用标准1 * 1卷积联合。许多研究更多关注降低模型和计算复杂度上,它们假设通道之间的联系可以当做与实例无关的,在局部感受野上的组合。相反,我们假设,这个单元有一种机制,来显式使用全局信息对通道之间的关系进行动态、非线性建模,这样可以使得学习过程更加容易,极大增强了网络的表示能力。

Algorithmic Architecture Search.

除了上面介绍的工作,还有许多有着悠久历史的工作,旨在放弃手工结构设计,而是试图自动地学习网络结构。该领域的许多早期工作是在神经进化社区中进行的,该社区建立了使用进化方法搜索网络拓扑的方法。尽管通常需要很大的计算量,进化搜索取得了很大的成功,包括为序列模型找到好的memory cell,为大尺度图像分类学习复杂结构。为了减少这些方法的计算量,已经提出了一些有效率的替代方法。

通过将搜索最佳结构当作对超参数进行优化,随机搜索以及其他更复杂的基于模型的优化技术可以用来处理这个问题。拓扑搜索以及直接的结构预测被提出,可以当做额外的结构搜索工具。使用强化学习技术可以取得非常好的结果。SE block就可以用作这些搜索算法的building block,并被证明在并发工作中非常有效。

Attention and gating mechanisms.

可以将注意力理解为将可用计算资源的分配偏向信号中最有用的组件的一种方式。注意力机制已经证明在许多任务中都有效,比如序列学习、定位已经图像理解、图像字幕和唇语阅读。在这些应用中,它可以作为操作符并入一个或多个层,这些层代表用于模式之间的适应的高层抽象。一些工作对空间和通道注意力进行了研究。

我们的SE block使用一个简单的gating机制,致力于通过以计算有效的方式对通道之间的关系进行建模来增强网络的表示能力。

3. Squeeze-and-Excitation Blocks

一个SE block是一个计算单元,将输入X通过变换Ftr映射为特征图U。我们把Ftr为设为卷积操作,使用V=[v1、v2、…、vC]表示卷积核,vC表示第c个卷积核的参数,这样我们的输出为U=[u1、u2、…、uC],其中

vcs是一个二维空间核,表示作用于输入X对应通道的卷积核。为了简化标记,省略了偏置。**因为最后的输出是由所有通道上的和产生,因此通道之间的关系被隐式嵌入vc中,同时与卷积核捕获的局部空间关联纠缠在一起。**因为由卷积建模的通道间的关系是隐式且局部的(除了最后几层)。**我们希望卷积特征的学习过程可以通过显示地对通道之间关系进行建模来增强,因此网络应该增强它对informative特征的敏感性,可以用于后续的变换。**因此,我们希望使用全局信息,然后重新对准卷积核响应,分为两步,squeeze和excitation,然后再送入下一层,如图1所示。

3.1 Squeeze: Global Information Embedding

为了解决利用通道间关系的问题,我们首先考虑输出特征图中每个通道的信号。每个卷积核使用一个局部感受野进行操作,因此每个卷积核的输出U不能够获得这个区域之外的contextual信息。

为了缓解这个问题,**我们提出将全局空间信息挤成(squeeze)一个通道描述子。这通过使用按通道的全局平均池化来实现。**形式上,直接求和除以空间尺寸,因此第c通道上的描述量为

这样输出特征图U就可以使用所有通道的描述子的集合向量来表示,可以代表整张图像的信息。这里我们选择了最简单的汇总操作,全局平均池化,使用更复杂的策略也可以。

3.2 Excitation: Adaptive Recalibration

为了利用squeeze操作聚合的信息,我们进行第二步操作来完全的capture通道间的关系。为了完成这个目标,这个函数需要满足两个要求:

  • 第一,必须是灵活的(尤其是,必须可以学习到通道之间的非线性关系)
  • 第二,它必须学习到非互斥的关系,因为我们想利用多个通道的信息,而不是one-hot的。

为了满足这两个要求,我们选择使用一个简单地gating机制,带有sigmoid激活:

为了限制模型的复杂度并有助于提升概括能力,我们通过在非线性周围使用两个FC层构成瓶颈结构来实现门机制的参数,**即一个带有降维比例r的降维层,一个ReLU,和一个升维层来将通道维度恢复到U的维度。**block最后的输出通过使用s来rescaleU来得到:

激励操作将上一步生成的z映射到一系列通道权重上进行计算。在这种情况下,SE块从本质上引入了取决于输入的动态特性,可以将其视为通道上的自注意函数,这些通道的关系并不局限于卷积核响应的局部感受野。

3.3 Instantiations

SE block可以直接应用到标准结构中,比如VGG,直接插入到每个卷积的非线性之后。而且,SE block的灵活性意味着它可以直接到标准卷积以外的变换上。为了解释这一点,我们通过将SEblock组合到几个更复杂的结构中,得到了SENets,将在下面说明。

我们首先考虑对Inception加入SE blocks。这里我们直接将变换Ftr设置为整个Inception模块(如图2),然后对Inception的每个模块都进行这样的操作,获得了SE-Inception网络。

SE blocks同样可以直接应用到残差网络中(如图3)。这里,SE block的变换Ftr为残差网络中non-identity的分支。遵循相似的逻辑,我们同样可以将SE block应用到ResNeXt、Inception-ResNet、MobileNet、ShuffleNet等。

对于SENet结构的实际例子,表1中给出了SE-ResNeXt-50的结构细节。

SE block具有灵活的特性,其结果之一就是可以通过多种可行的方式将其集成到这些网络结构中。因此,为了评价这些整合策略的敏感度,我们在6.5中设置了剥离实验来比较不同的策略。

4. Model and Computational Complexity

实际应用中,需要考虑到使用SE block提升的准确率和增加的模型复杂度之间的平衡。我们以ResNet-50和SE-ResNet-50作为例子进行对比。前者对于输入一张224 * 224图像,前向运算需要大约3.86GFLOPs。每个SE block使用全局平均池化操作和两个小的fc层,之后一个scaling操作。当将降维比例r设置为16,SE-ResNet-50需要大约3.81GFLOPs,比前者增加了0.26%。增加了这么一点计算,网络的效果超过了ResNet-50,甚至达到了ResNet-101的水平(需要7.58GFLOPs)。

在实际应用阶段,整个前向和反向传播,前者需要190ms,后者需要209ms。我们认为,在对全局池化和小的內积操作针对GPU进行优化之后,时间还会减少。我们使用CPU的测试时间进行对比,前者需要164ms,后者需要167ms。我们认为这一点点的时间提升相对于效果的提升来说是值得的。

下面我们考虑SE block引入的额外参数。这些额外参数主要来自于两个fc层,因此只占总网络的一小部分。这些fc层总引入的参数量如下:

r为降维比例参数,S为阶段数量(一个阶段指的是在一个公共特征图上进行操作的块的个数),Cs表示输出通道维度,Ns表示对于阶段s的重复block个数(fc层如果使用偏置,引入的参数和计算量也可忽略不计)。**SE-ResNet-50引入了大概2.5million的参数,ResNet-50需要大概25million参数,因此,引入了大概10%的参数增加。**实际上,这些参数的大部分是来自网络的最后阶段,因为最后阶段的激励操作在特别多的通道上进行(通道维度很大)。然而,我们发现,可以将最后阶段的SE block移除,最后的结果损失很小(top-5错误率损失小于0.1%),这样可以将参数增量减少到大约4%,在参数量是一个关键考虑问题的任务中,这很有用。

5. Experiments

在这部分,我们进行实验来探究SE block在一系列任务、数据集以及模型结构中的有效。

5.1 Image Classification

我们首先在ImageNet2012数据集上进行实验,包括1.28million训练集和50k验证集,一共1000类。我们在训练集上训练,在验证集上使用top-1和top-5错误率评价模型。

每个基础模型和它的SE版本都是使用相同的优化策略。我们使用标准的方法,使用随机裁剪进行数据增强(224像素或299),使用随机水平翻转。每个输入图像使用RGB通道均值进行归一化。所有模型在我们的学习系统ROCS上进行训练,这时为了处理平行训练。使用同步SGD进行优化,动量0.9,batchsize为1024。初始的学习率为0.6,之后每30epochs除以10,模型从头训练100epochs,降维比例r默认设置为16。

当评价模型时,我们使用每张图像的中心crop(resize到256,然后取中间的224,或resize到352取中间299)。

Network depth.

我们首先比较SE-ResNet和原始的ResNet结构,使用不同深度的结构,结果如表2所示。

我们观察到**SE-ResNet在不同深度上持续提升原来结构的表现,且只引入很少的计算复杂度。**SE-ResNet-50取得了接近ResNet-101的效果,且计算量只有它的一半左右。更深层的结构上,效果更加明显,SE-ResNet-101甚至超过了ResNet-152的效果。值得注意的是,SE block自己就是增加了深度,但是是以一个非常有效率的方式增加,因此即使在基础网络非常深的时候,加入SE block还是有效果提升。而且,我们看到在不同网络深度上SE都对原网络有提升,这表明这种提升与增加网络深度获得的提升应该是正交互补的。

Integration with modern architectures.

我们下面研究将SE block整合到两个SOTA结构中,Inception-ResNet-v2,ResNeXt(32 * 4d),都引入了额外的计算building block到基础网络。我们构建了与之相对应的SENets,SE-Inception-ResNet-v2和SE-ResNeXt,在表2中报告结果。与之前实验一样,我们在两种结构都观察到引入SE block带来的表现提升。**特别是,SE-ResNeXt-502取得了5.49%的top-5错误率,超过了ResNeXt-50和ResNeXt-101。**我们注意到,我们使用Inception-ResNet-v2的效果与原论文中有一些差距。然而,我们使用SE block之后也观察到了相似的趋势。

我们同样对non-residual的网络VGG-16和BN-Inception结构使用SE block进行修改。为了从头训练VGG-16,我们在每个卷积之后增加BN。我们使用相同的策略训练了VGG-16和SE-VGG-16,结果如表2所示。与针对残差网络的对比结果类似,我们观察到SE block同样可以带来表现上的提升。

为了直观看出SE block的优化效果,我们把原网络和对应SE网络的训练区间画了出来,如图4所示。我们观察到SE blocks在整个训练过程中取得了稳定的提升。而且这种趋势在多种网络上都是一致的。

Mobile setting.

最后,我们考虑两个有代表性的结构,针对于移动设备的网络,MobileNet和ShuffleNet。实验中,我们使用minibatch256,更少的数据增强和正则化。我们在8个GPU上训练模型,使用了动量0.9,初始学习率为0.1,当验证loss变平就除以10,一共训练大约400epochs。结果如表3所示,SE blocks持续大幅提升准确率,只引入了很少的计算花费。

Additional datasets.

下面我们研究SE block是否在其他数据集上也有这样好的效果。我们使用了几个流行的基础网络和技术(ResNet-110、ResNet-164、WideResNet-16-8、Shake-Shake、and Cutout),应用在CIFAR-10和CIFAR-100数据集上。每个基础网络和对应的SENet版本使用相同的方法训练。训练的超参数与结构对应的原论文中一致。结果如表4、表5所示。我们观察到,在每个对比中,SENets的效果都超过了基础网络,这表示SE block的效果不只局限于ImageNet数据集。

5.2 Scene Classification

我们也在Places365数据集上进行场景分类实验。相对于分类,场景分类可以评估模型概括能力和处理抽象的能力。这是因为它经常需要模型来处理更复杂的数据联系,需要对更高等级的表现形式鲁棒。

我们选择使用ResNet-152作为基础网络来评估SE blocks的效果。实验中,模型是从头训练的。结果如表6所示。我们发现,SE-ResNet-152比ResNet-152取得了更低的错误率,这证明SE block对场景分类同样是有效的。SENet超过了之前SOTA的Places-365-CNN。

5.3 Object Detection on COCO

接下来我们评价SE block在COCO上进行目标检测的效果。参数使用在ImageNet上预训练的参数。我们使用Faster R-CNN作为基础检测框架,直接将backbone取代为SENets,其他不改变,观察结果。表7报告了这些结果,SE-ResNet-50相对于原来的ResNet-50,准确率提升2.4%,AP提升3.1%。SE block同样使得ResNet-101提升了2.0%的AP。这就验证了SE block的泛化能力,可以对许多任务进行提升。

5.4 ILSVRC 2017 Classification Competition

我们以SENets为基础,参加了ILSVRC比赛,取得了第一名。我们的提交网络是几个SENets的组合,使用了标准的多尺度和多crop融合策略,在测试集上取得了2.251%的top-5错误率。作为提交的一部分,我们构建了一个额外的模型SENet-154(将SE block整合到ResNeXt)。我们将这个模型与之前模型进行对比,如表8所示,使用了标准的crop size。我们观察到SENet-154取得了最好的结果。

在比赛之后,我们进行了进一步的提升,表9展示了我们目前达到的最好效果。我们最好的表现只使用了ImageNet的数据,这个方法使用了强化学习来进行数据增强,提升了表现。之前最好的表现的模型使用ResNeXt-101 32 * 48d,但是这个模型使用了1billion的弱标记图像,如果我们也使用的话,效果可能会更好。

6. Ablation Study

这部分我们进行剥离实验来对SE block的各部分有更好的理解。所有的剥离实验都是在ImageNet上进行的。ResNet-50作为基础backbone。我们发现,对于ResNet结构中,将激励操作的FC层的偏置移除,有助于对通道间的关系进行建模,在后续试验中使用这个操作。

数据增强操作与5.1中一致,学习率设为0.1,直到loss平,再除以10。训练中使用label-smoothing正则化。

6.1 Reduction ratio

式5中的降维比例r是一个超参数,来对SEblock中的计算消耗的能力进行控制。我们使用不同的r构建SE-ResNet-50,比较结果,如表10所示。

**提升的计算复杂度并没有提升网络的表现,因此使用r=16就可以达到准确率和复杂度的平衡。**实际中,在整个网络中都使用相同的r可能不是最佳的,所以可以进一步进行微调来找到最好的r的安排。

6.2 Squeeze Operator

我们发现使用全局平均池化作为squeeze操作符,比使用全局最大池化效果好,因此我们不考虑更复杂的操作。结果如表11所示,尽管最大池化和平均池化都有效,平均池化效果更好一点,因此选择这个为squeeze操作符。然而,我们注意到,SE block的表现对特定聚合操作符是鲁棒的。

6.3 Excitation Operator

下面我们对激励机制选择非线性。我们考虑两个操作,ReLU和tanh,实验中将sigmoid取代为这两个之一。结果如表12所示,我们看到,将sigmoid改为tanh,表现变差,使用ReLU效果更差,导致SE-ResNet-50比基础的ResNet-50还差。这表明为使SE block有效,精心构造激励算子非常重要。

6.4 Different stages

我们探究将SE block插入不同阶段的影响,我们每次只将SE block整合到ResNet-50的一个阶段,即stage_2、stage_3、stage_4,结果如表13所示。我们观察到,对每个阶段引入SE block,都会取得表现提升,且在不同阶段取得的提升是正交互补的,因此可将所有阶段都引入SE block来取得最好效果。

6.5 Integration strategy

最后,我们来评估将SE block整合到网络中的位置不同的影响。除了提出的设计,我们考虑三种变体。

  • SE-PRE block,SE block移动到残差单元之前。
  • SE-POST block,SE block移动到identity分支的求和之后
  • SE-identity block,将SE block移动到identity上,与残差单元平行

如图5所示:

表14中,我们发现,SE-PRE、SE-identity和我们标准的SE block表现的效果相似,SE-POST效果较差。实验表明SE单元的位置也是很鲁棒的。

在上面的实验中,每个SE block都放置在残差单元结构的外面。我们也将SE block放在残差单元内部,将它放在3 * 3卷积之后,因为3 * 3层处理更少通道,因此这样SE block引入的参数更少。表15比较了原来的结构和SE_3×3的效果,后者取得了相近的效果,但是参数更少。因此我们认为,可以针对特定的结果将SE block嵌入结构中,可能会取得好的效果。

7. Role of SE Blocks

尽管我们提出的SE block已经在多种任务上取得了很好的效果,我们还是希望理解squeeze操作和excitation操作实际上的相对重要性。对由深度神经网络学到的表示进行严格的理论分析仍然具有挑战性,因此,我们采用经验方法来检查SE block所起的作用,以期至少对它的实用功能有一个初步的了解。

7.1 Effect of Squeeze

为了验证通过squeeze操作生成的全局embedding是否起着重要作用,我们使用一个SE block的变体进行试验,增加了相同数量的参数,不使用全局平均池化。即,我们移除了池化操作,使用两个与激励操作中维度相同的1 * 1卷积取代fc层,我们称为NoSqueeze,激励操作的输出与输入的空间维度一致。与SE block相反,这些逐点卷积操作是局部操作符。而在实际中,深度网络的后续层通常处理一个全局感受野,全局的embedding不再直接在网络中传播。表16中比较了两种模型和基础模型的效果,我们观察到全局信息的使用对模型表现有很大的影响,与NoSqueeze相比,SE block以更高效的方式利用全局信息。

7.2 Role of Excitation

为了更清晰的展示SE block中激励操作,这部分,我们研究SE-ResNet-50模型中的激活函数,探究它们相对于不同类别和不同输入图像以及不同网络深度的贡献。尤其是,我们希望理解激励操作在不同类别的图像以及同一类的不同图像如何变化。

我们首先考虑激励操作对于不同类别图像的贡献,我们从ImageNet选取四个类别,然后从验证集中画出每一类的50个样本,计算网络每个阶段的最后一个SE blcok对于每一类的平均激活值(50个取平均)。在图6中画出了分布图,作为参考,我们同样画出了对于所有1000类别的平均激活分布。

对于激励操作扮演的角色,我们有三个观察:

  • 第一,在早期的层上,对于不同类别的分布非常相似。这表示在早期阶段,通道的信息在不同类别间是共享的。
  • 第二,在更深的情况下,每个通道的值变得越来越class-specific,这与之前的工作中的发现一只,前面的层的特征更加通用,后面的层更加具体。

我们在网络的最后阶段观察到了一些不一样的现象。SE_5_2上展示出了一种饱和的现象,大部分激活值接近1。当把所有的激活值都为1的时候,SE block就退化成了identity操作。**在网络的最后SE_5_3(卷积池化之后,分类器之前),对不同类别激活值曲线相似。这表明SE_5_2和SE_5_3在重新对准网络上没有之前的block重要。**这个发现与第4部分中的实验发现一致,表明可以将最后一个阶段的SE blocks移除,减少大量参数,准确率只下降一点。

最后,我们研究对同一类别不同该图像的激活值的均值和标准差,如图7所示。

我们观察到与上面相似的结果,这表明SE block在不同类别和同一类别例子之间的表现是动态的。特别是在网络的较晚层中,在单个类中存在相当多的表示形式,网络学会利用特征重新校准来提升其辨别能力。总结来说,SE block可以产生instance-specific的响应。

8. Conclusion

本文中我们提出了SE block,一个结构单元,通过进行动态的按通道的特征重新校准来提升网络的表示能力。一系列的实验都展示出SENets的有效,在多个数据集和任务上取得了SOTA效果。另外,SE block也为以前的网络无法对通道间的关联进行建模,提供了一些启发。我们希望这些启发可以在其他需要强大辨别力特征的任务上有用。最后,由SE blocks产生的特征重要性值可能对于其他任务,比如网络修剪和模型压缩有用处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值