【读点论文】 MoCoViT: Mobile Convolutional Vision Transformer,将ghost模块与transformer的编码器结合在一起

MoCoViT: Mobile Convolutional Vision Transformer

Abstract

  • 最近,Transformer网络在各种视觉任务中取得了令人印象深刻的结果。然而,它们中的大多数计算成本很高,不适合实际的移动应用程序。在这项工作中,本文提出了移动卷积视觉转换器(MoCoViT),通过将transformer引入移动卷积网络来利用这两种架构的优势,从而提高了性能和效率

  • 与最近的视觉transformer的研究不同,MoCoViT中的移动transformer块是为移动设备精心设计的,非常轻量化,通过两个主要的修改完成:移动自我注意(MoSA)模块和移动前馈网络(MoFFN)。MoSA通过分支共享方案简化了注意力图的计算,而MoFFN在transformer中充当移动版MLP,进一步大大减少了计算量

  • 综合实验证实,本文提出的MoCoViT家族在各种视觉任务上优于最先进的便携式cnn和transformer神经架构。在ImageNet分类上,它在147M FLOPs时达到74.5%的top-1准确率,比MobileNetV3获得1.2%的计算更少。在COCO对象检测任务上,MoCoViT在RetinaNet框架下比GhostNet高出2.1 AP

  • 论文地址:[2205.12635v1] MoCoViT: Mobile Convolutional Vision Transformer (arxiv.org)

Introduction

  • (Vision transformer, ViT)在图像分类、目标检测[Microsoft coco: Common objects in context]、语义分割等任务上的性能都比CNNs有显著提升。然而,这些性能的提高通常以较高的计算成本为代价。例如,DeiT需要超过10G的multi - add来执行一个图像分类任务。如此高的计算资源需求超出了许多移动设备的能力,例如智能手机和自动驾驶汽车。

  • 为了缓解这种问题,Swin[Swin transformer: Hierarchical vision transformer using shifted windows]将每个标记的注意区域从完全注意限制为局部注意,其中输入被分割为子窗口,并且自我注意只在每个窗口内执行。twin[Twins: Revisiting the design of spatial attention in vision transformers]提出了空间可分离的自我注意,将局部分组的自我注意和全局下采样的注意分别应用在两个连续的块上。不幸的是,复杂性仍然太大,无法部署在移动设备上。

  • 在过去的几年里,针对移动视觉任务的卷积神经网络(CNN)的设计已经取得了很大的进展。例如,MobileNets利用深度卷积和点卷积来近似普通卷积层,并取得了相当的性能。ShuffleNet进一步提出了一种信道混洗操作,以增强紧凑模型的性能GhostNet设计了一个Ghost模块,通过廉价的操作生成丰富的功能图。

  • 在这项工作中,本文寻求为移动设备设计一种轻量级的transformer,并在复杂性和性能之间取得良好的平衡。一些研究人员[LeVit,Mobilevit,Cvt,Mobile-former]首次尝试将CNNs的强度与transformer相结合,开发轻型transformer。

  • 在[Cvt]中,将MobileNetV2块和变压器块串联在一起,并开发了一个MobileNetV2块来学习全局表示。但与移动cnn相比,MobileVit仍然相对沉重。在[Mobile-former]中提出了Mobile-Former,它是MobileNet和Transformer的并行设计,在两者之间采用双向桥进行通信。

  • 与以往的工作不同,本文提出了一种非常高效的移动transformer块(MTB)。该模块是为移动视觉任务精心设计的,由两个关键组件组成:移动自我注意(MoSA)和移动前馈网络(MoFFN)。

  • 在MoSA中,在查询、键和值的计算中,线性层被轻量级的Ghost模块代替。此外,在计算过程中利用分支共享机制实现权值的重用。因此,MoSA比普通的自我关注更有效。对于多层感知(Multi Layer Perception, MLP),其复杂性在变压器块中不可忽视。

  • MoFFN的产生就是为了解决这个问题。用高效的Ghost模块替换MLP中的上投影和下投影线性层,形成MoFFN。在此基础上,本文提出了移动卷积视觉转换器(MoCoViT),这是一种用于移动应用的新架构,将CNN块和MTB块串联在一起。为了达到复杂度和性能的最佳权衡,CNN块被放置在早期阶段,而MTB块只在最后阶段使用

  • 为了验证MoCoViT的有效性,本文在各种视觉任务上进行了一系列的实验,如ImageNet-1K分类,以及COCO上的目标检测和实例分割。大量实验结果表明,MoCoViT的性能优于其他最先进的轻量级CNN网络和轻量级transformer,如MobileNetV3, GhostNet和Mobile-Former。如下图所示,MoCoViT在FLOPs范围为40M ~ 300M时获得最好的结果。

    • 在这里插入图片描述

    • MoCoViT与高效CNNs在准确率方面的比较。比较是在ImageNet分类上进行的。MoCoViT始终优于SOTA高效cnn。

  • 具体来说,MoCoViT在ImageNet-1K上实现了74.5%的top-1准确率,147M FLOPs,比MobileNetV3高1.2%,比GhostNet高0.6%。总结起来,本文的工作贡献如下:

    • 本文提出了一种用于移动设备的极其轻量级的transformer块。在block内部,精心设计了Mobile Self-Attention和Mobile前馈网络,旨在实现复杂性和性能之间的最佳权衡。

    • 本文提出MoCoViT,一个有效的架构,结合CNN和transformer的优势,并在各种视觉任务上实现SOTA性能。

Related Work

Light-weight Convolutional Neural Networks (CNNs):

  • MobileNetV2提出了一种在反向瓶颈结构中利用深度卷积和点卷积对局部滤波器处理进行建模的有效方法。ShufflenetV2提出了利用组卷积和信道卷积简化点卷积的shuffle算法。其他有效的运算符包括Butterfly transform、GhostNet中廉价的线性变换,以及AdderNet中使用廉价的加法来交换大量的乘法。MixConv探索了多个内核大小的混合,而Sandglass则翻转了反向剩余块的结构。effentnet和TinyNet研究了深度、宽度和分辨率的复合标度。

Vision Transformers (ViT):

  • ViT采用标准transformer编码器,将图像直接分解为一组不重叠的patch序列,构建了无卷积的图像分类器。虽然它收获了有希望的结果,但当只在中型ImageNet上从头开始训练时,数据需求大的transformer和表现最好的CNNs[33]之间仍然存在差距。

  • 为了弥补这一差距,DeiT提出了一种基于符号的蒸馏过程和数据高效训练策略,以有效地优化Transformer。

  • 随后,随访对ViT的不同方面进行了改进,使其更适合于视觉任务。Cvt, CeiT将卷积设计纳入到自我注意或FFN中,增强局部性。CPVT利用卷积的隐式位置表示能力(具有零填充)对任意大小的输入进行条件位置编码。然后,通过逐步缩减令牌数量和用平均池替换类令牌来执行层次金字塔结构。因此,在多级特征的支持下,Transformer可以方便地处理目标检测和图像分割任务。

  • 最新的[Coatnet]研究表明,将卷积和transformer相结合可以提高预测精度和训练稳定性。BoTNet通过在ResNet的最后三个瓶颈块中使用全局自关注来替换空间卷积,在实例分割和对象检测方面有了显著的改进。

  • ConViT通过引入门控位置自注意(GPSA)对ViT进行软卷积诱导偏差改进。CvT在每次多头注意之前引入深度/点卷积。LeViT和ViTC使用卷积干(堆叠33个卷积)代替patchify stem。

  • LeViT和ViTC在低FLOP模式下表现出明显的改进。在本文中,本文遵循了将CNN网络和transformer网络相结合的想法,将本文提出的Mobile SelfAttention合并到一个轻量级的CNN网络中,在低FLOPs状态下优于其他高效的CNN和ViT变体。

Methodology: MoCoViT

  • 在本节中,首先介绍为轻量级网络设计的移动自我注意(MoSA)机制,与普通的自我注意机制相比,它可以大大减少计算开销。然后,本文介绍了如何用一种更高效的操作来构建移动前馈网络(MoFFN),以取代传统的MLP层。使用本文提出的MoSA和MoFFN,本文能够生产高效的移动transformer块(MTB)。最后,本文介绍了如何使用MTB来构建提出的移动卷积视觉transformer(MoCoViT),这是一个高效的轻量级网络,利用了卷积神经网络和视觉transformer的优点。

Mobile Self-Attention (MoSA)

  • vanilla transformer architecture由多头自注意(MHSA)层和MLP层交替组成。在每个块之前应用LayerNorm (LN),在每个块之后应用残差连接。自我注意机制作为视觉transformer网络的核心部分,已在各种视觉任务中显示出其有效性。vanilla transformer architecture的自我注意可以被计算为:

    • S e l f − A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d k ) V ,( 1 ) Self-Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d_k}})V,(1) SelfAttention(Q,K,V)=Softmax(dk QKT)V,(1

  • 其中 Q 、 K 、 V ∈ R N × C Q、K、V∈\Bbb R^{N×C} QKVRN×C为查询、键、值矩阵,dk为查询/键通道维数,N为令牌数量,C为令牌的通道维数。然而,在容量有限的轻量级模型中,自注意力的成本低于卷积层。自注意的计算复杂度是空间分辨率的二次元。并引入三个相同层次的线性层来计算V的线性组合结果。

  • 为了缓解这一问题,本文引入了MoSA,一种为轻型变压器结构设计的注意机制。它主要从两个方面简化了普通的自我注意。

    • 首先,在细粒度操作方面,本文将vanilla self-attention中的线性层替换为更高效的Ghost模块,这是轻量级网络中常用的结构,可以被视为卷积操作的一种高效变体,以低成本的方式生成相对相似的特征对。下图显示了Ghost模块的结构。Ghost模块采用普通的卷积方法,首先生成一些本征特征映射,然后利用廉价的线性运算来增加特征和增加通道。在实践中,廉价的线性运算通常被实现为深度卷积,以获得更好的性能-速度权衡。

    • 在这里插入图片描述

    • 本文方法的总体框架。左:VIT模型。右边:本文提议的MoCoViT。移动transformer组由本文提出的移动自注意和移动前馈网络组成。移动自注意中的分支共享机制避免了Q和K的计算,通过重用V来计算注意图。用Ghost模块代替Linear layer,去掉LayerNorm,提高效率。

    • 其次,从宏观角度出发,本文提出了分支共享机制来重用Q、K、V计算中的权值。如上图所示,f q, f k, f v分别是具有相同输入特征的q, k, v的投影。在本文的分支共享机制中,本文直接将特征V重用到Q和K中。

    • 这种方法主要基于本文的一个见解:Q和K只参与注意图的计算,而自我注意机制的最终结果是V中每个令牌的线性组合。与Q和K相比,V需要保留更多的语义信息,以保证最终加权求和结果的表示能力。因此,自我注意机制的结果与V强相关,而与Q、K弱相关。因此,对于小容量的移动网络,本文可以简化Q和K的计算,以达到更好的性能开销平衡。

  • 分支共享机制可以表示为:

    • f v = f k = f q V = f v ( X ) K = f k ( X ) = I d e n t i t y ( V T ) Q = f q ( X ) = I d e n t i t y ( V ) , ( 2 ) f^v=f^k=f^q\\V=f^v(X)\\ K=f^k(X)=Identity(V^T)\\ Q=f^q(X)=Identity(V),(2) fv=fk=fqV=fv(X)K=fk(X)=Identity(VT)Q=fq(X)=Identity(V),(2)

    • 其中,f v, f k, f q分别是计算q, k, v的投影。为了进一步提高性能,本文还引入了深度卷积层作为细化器来进一步增强该transformer块。MoSA的计算公式为:

    • M o S A ( V ) = S o f t m a x ( V V T d k ) V + D e p t h w i s e ( V ) , ( 3 ) MoSA(V)=Softmax(\frac{VV^T}{\sqrt{d_k}})V+Depthwise(V),(3) MoSA(V)=Softmax(dk VVT)V+Depthwise(V),(3)

  • 本文提出的移动自我注意的计算复杂度为:

    • Ω ( M o S A ) = H W C 2 + 2 ( H W ) 2 C , ( 4 ) Ω(MoSA)=HWC^2+2(HW)^2C,(4) Ω(MoSA)=HWC2+2(HW)2C,(4)

    • 式中N = H × W为空间维度,C为通道维度。为了定量地展示开销的减少,本文比较了不同分辨率下vanilla self-attention和MoSA的FLOPs和参数。与vanilla self-attention相比,MoSA的FLOPs减少了3.6×,如下图所示,参数减少了2.4×。

    • 在这里插入图片描述

    • 左边:Comparison of FLOPs at various resolutions between Vanilla SelfAttention and MoSA.

    • 右边:Comparison of FLOPs at various resolutions between Vanilla MLP and MoFFN.

Mobile Feed Forward Network (MoFFN)

  • 在普通的ViT的transformer块中,MLP层由一个向上投影的全连接(FC)层和一个向下投影的FC层组成,并且在MLP部分之前应用LayerNorm。为了在移动设备上部署,本文用一个更高效的Ghost模块替换了普通MLP中的FC层。如图结构所示,本文在MoFFN中使用批处理规范化,这可以在部署时合并。

  • 另外,本文没有使用移动端部署不友好的GeLU激活功能,而是采用了轻量级模型中广泛使用的ReLU激活功能。上投影Ghost模块后,还应用了挤压与激发(SE)模块。

  • 除了计算效率高,MoFFN比普通MLP有更大的感受野。在原有的ViT架构中,MLP主要通过线性层提取单个令牌的通道维度信息,而空间维度上的信息交互主要在自我注意部分进行。换句话说, vanilla ViT中的MLP没有空间意识,因此需要在自我注意之后使用

  • 本文的MoFFN解决了普通MLP的这个缺点。本文首先在Ghost Module中通过点卷积提取每个令牌的通道维特征,然后使用大小为3×3的核进行深度卷积提取空间维特征。最后,本文将点卷积和深度卷积的输出连接起来。

  • 本文定量分析了不同分辨率下MoFFN带来的计算开销减少。结果如上图所示。可以看到,MoFFN的FLOPs次数比普通MLP大约少1.9倍。

Enhancing Lightweight Networks with Mobile Self-Attention and Mobile Feed Forward Network.

  • 在本节中,首先介绍移动transformer块(MTB),它由本文提出的MoSA和MoFFN组成。然后介绍了如何使用移动变压器块来构建一个高效的MoCoViT。

  • Mobile Transformer Block (MTB).

    • 本文利用MoSA和MoFFN的优点,介绍了一种专门为轻量化深度模型设计的移动transformer块。如结构图所示,vanilla transformer块由多头自我注意(MHSA)层和MLP层交替组成。

    • 在每个区块之前和之后分别应用LayerNorm (LN)和残差连接。在MTB中,本文保留了每个区块后的残差连接,但将vanilla自我注意和vanillaMLP替换为本文提出的MoSA和MoFFN。

    • 另外,本文在注意和MLP部分之前去掉了效率低下的LayerNorm,在Ghost模块内替换为批处理规范化(BN)。BN是一种移动友好的标准化操作,因为它可以在部署时与卷积层合并。

    • 得益于MoSA和MoFFN的轻量化设计,本文的MTB比普通transformer块具有更少的计算开销。如下表所示,MTB的FLOPs比普通变压器块约小2.2×。

    • 在这里插入图片描述

    • Comparison of FLOPs and parameters at various resolutions between Vanilla Transformer Block and Mobile Transformer Block (MTB).

  • Building efficient networks with Mobile Transformer Block.

    • 在这一部分,本文介绍了如何使用MTB来构建本文提出的轻量级网络MoCoViT,它结合了卷积网络和transformer网络。

    • 如上图结构所示,本文的MoCoViT采用特征金字塔结构,特征图的分辨率随着网络深度的增加而降低,而通道数的增加

    • 本文将整个体系结构分为4个阶段,本文只在最深入的阶段使用MTB。这主要是基于两点考虑:

      • 一是自注意的计算复杂度随空间分辨率呈二次型。在浅层阶段,特征具有较高的空间分辨率,这导致了较大的计算开销和内存消耗。

      • 其次,在轻量级网络的早期阶段,由于网络的表示能力有限,构建全局表示是一项相对困难的任务。transformer块的优点是提取全局信息,而cnn擅长提取局部信息。因此,在网络的浅层中,使用CNN块有助于提高特征提取的效率。

  • MoCoViT的结构细节如下表所示。本文在早期阶段使用Ghost瓶颈,它广泛应用于移动设备(例如智能手机和自动驾驶汽车)。所有的幽灵瓶颈都应用了步幅=1,除了每个阶段的最后一个步幅=2。本文提出的MTB被用于最后阶段。最后通过全局平均池化和卷积层将特征映射转换为1280维的特征向量进行最终分类。

    • 在这里插入图片描述

    • MoCoViT的架构。G-bneck表示Ghost瓶颈。MTB表示本文的移动transformer块。Exp表示膨胀大小。Out表示块的输出通道。步幅表示在一个阶段中第一个挡步的步幅。

  • 为了进一步提高性能,本文引入了动态ReLU激活函数来构建mocovitd模型。网络的整体框架与MoCoViT相同。但是在transformer块和CNN块中,本文用动态的ReLU代替了ReLU激活函数。本文使用不同于MoCoViT的策略训练mocovitd,并在ImageNet-1K数据集上获得更高的精度。

Experiments

  • 在下面的部分中,本文将提出的模型与ImageNet-1K和COCO上的其他先进技术进行比较。接下来,本文进行消融研究,以验证每个关键成分的有效性。

  • Classification on ImageNet-1K

    • 为了验证提出的MoCoViT算法的优越性,本文在ImageNet分类任务上进行了实验。本文遵循GhostNet中使用的大多数设置,除了初始学习率设置为0.5,而批大小为1024。在ImageNet验证集上报告的所有结果都具有单作物精度。SOTA的一些移动网络架构被选为竞争对手,包括GhostNet系列、MobileNet系列、ShuffleNet系列等。所有的网络都在8个特斯拉V100 gpu上训练。为了进行公平的比较,本文对MoCoViT和mocovitd使用了两种不同的训练设置。

    • Basic Training Setup.

      • 对于MoCoViT,本文使用基本设置,没有训练技巧。具体来说,所有模型训练360个epoch,输入尺寸为224 × 224。本文使用权重衰减为4 × 10−5的SGD优化器。批量大小和初始学习率分别设置为1024和0.5,使用5 epoch线性预热的余弦学习率调度器。不使用额外的数据扩充,如Mixup和autoaugment。
    • Advanced Training Setup.

      • 对于具有动态ReLU的mocovitd家族,本文采用了更高级的训练策略,训练过程更长,数据增强能力更强。所有模型都是使用SGD优化器从头开始训练的,为450个epoch。数据增强包括autoaugment、Mixup、Cutmix。输入图像尺寸仍然是224 × 224,权重衰减设置为8 × 10−5。使用带有5个epoch线性预热的余弦学习率调度器,而批大小和初始学习率设置为1024和0.5。
    • Comparison with State-of-the-art Mobile Models.

      • 在下表中,本文将MoCoViT Transformer与最先进的CNN和Transformer架构进行了比较。

        • 在这里插入图片描述

        • 在移动设置下与先进的ImageNet进行比较。

      • 这些模型分为两组。在第一组中,本文将MoCoViT与没有动态ReLU的CNN模型进行比较,它们的训练设置与基本训练设置基本相同。第二组将MoCoViT与移动transformer网络进行比较。本文的高级训练设置类似于Mobile-Former采用的训练策略。

    • 对于SOTA移动cnn,本文根据GhostNet提出MoCoViT 0.5×、MoCoViT 1.0×和MoCoViT 1.3×三种模型。如上表第1组所示,与手动设计的cnn相比,它可以在较低的FLOPs下达到显著更高的精度。特别是MoCoViT 0.5×获得67.6%的44M FLOPs,这超过了MobileNetV2(0.35X)的top-1精度7.3%,而更快(从59M FLOPs到44M FLOPs)。与MobileNetV3 Large 0.75×相比,本文的MoCoViT 1.0×精度提高了1.2%,但仍然更少的复杂性(从155M FLOPs到147M FLOPs)

    • 针对SOTA移动transformer,本文提出了mocovitd 0.3×、mocovitd 0.5×、mocovitd 1.0×和mocovitd 1.2×四种型号。与SOTA手动设计的移动transformer相比,如上表中第二组所示,它可以在更低的FLOPs下达到更高的精度。其中mocovitd 0.3×的top-1精度为64.3%,比同行Mobile-Former-26M提高了0.3%。mocovitd 0.5×达到68.9%的top1准确率,在低FLOPs的情况下比Mobile-Former-52M高出0.2%。mocovitd 1.0×达到75.5%的top-1精度,比MobileFormer-151M与类似的失败,高0.3%。

COCO Object Detection and Instance Segmentation

  • 为了进一步评价MoCoViT的泛化能力,本文在COCO2017数据集[24]上进行了目标检测实验。我们使用trainval35k分割作为训练数据,并在[Twins: Revisiting the design of spatial attention in vision transformers]之后用mean Average Precision (mAP)报告最小分割的结果。

  • Training Setup.

    • 本文使用MMDetection和MoCoViT作为骨干特征提取器的替代,在RetinaNet和Mask R-CNN检测框架上验证了模型的有效性。所有模型使用与[twins]:AdamW优化器相同的设置,1× (12epoch)调度,全局批处理大小为16,在8个gpu上。输入图像的大小被调整为短边800和长边不超过1333。按照惯例,采用224 × 224图像计算FLOPs。
  • Comparison with State-of-the-art Mobile Models.

    • 如下表所示,在使用retinanet进行对象检测时,MoCoViT在相同的计算成本下,比MobileNetV3高出4.2% mAP,比GhostNet高出2.1% mAP。

      • 在这里插入图片描述

      • 基于RetinaNet框架的COCO2017对象检测结果。

    • 如下表所示,对于使用Mask R-CNN框架进行对象检测,MoCoViT相对于MobileNetV3和GhostNet带来了类似的改进。MoCoViT的mAP比GhostNet高2.2%,也比MobileNetV3高出1.0% mAP。以Mask RCNN框架分割为例,MoCoViT的mAP为28.9,比GhostNet高1.9%。

      • 在这里插入图片描述

      • 利用Mask R-CNN框架进行COCO对象检测和实例分割的结果。上标b表示检测结果,m表示实例分割结果。

Ablation Study

  • 为了更好地理解MoCoViT,本文通过评估每个关键设计在ImageNet-1K分类上的性能来去除它们。

  • Impact of MTB at different stages.

    • 本文比较了移动transformer块在不同阶段的使用精度,结果如下表所示。值得一提的是,当在浅层中使用移动自我注意时,模型的内存占用明显增加,因此减少了训练批的大小。

    • 在这里插入图片描述

    • MoCoViT 1.0×上不同位置的自我注意结果比较所有模型都在基本训练设置下训练180个epoch。第1阶段的结果没有显示,因为训练时间太长,无法接受。

  • Impact of MoSA and MoFFN.

    • 本文的MoCoViT包含两个重要的设计:MoSA和MoFFN。为了证明它们的重要性,本文在基本训练设置下训练GhostNet 0.5× 180个epoch。然后,本文比较不同类型的自我注意机制来评估性能的提高。结果如下表所示。

    • 在这里插入图片描述

    • 不同自我注意机制的结果比较。所有模型在基本训练设置下进行180个epoch的训练。

  • Impact of Normalization

    • 此外,本文还比较了分批归一化(BN)和层归一化(LN)在不同位置的性能。由下表可知,将BN放在self-attention模块和MLP模块的卷积运算之后,可以获得更高的精度,也有利于在部署时将BN层和卷积层合并,从而进一步提高速度。

    • 在这里插入图片描述

    • 将归一化放置在不同位置的结果比较。

Conclusion

  • 在本文中,本文设计了一种新型高效的移动transformer组。该模块由两个重要模块组成:移动自我注意(MoSA)和移动前馈网络(MoFFN)。MoSA通过分支共享机制简化了注意图的计算,避免了在自我注意中计算Q和K,通过重用V来计算注意图。MoSA的FLOPs次数比vanilla的少3.6倍。此外,所提出的MoFFN还可以大大减少普通MLP的计算量,可以看作是其移动版。与vanilla不同,MoFFN具有空间维度的感知能力。它比vanilla MLP有更大的感受野。除提取令牌信道维特征外,还可以进行空间维特征融合。

  • 在MTB的支持下,本文构建了融合卷积网络和transformer网络的轻量级transformer网络MoCoViT和mocovitd。大量实验表明,引入的MoCoViT家族在各种视觉任务上优于最先进的便携式轻量级cnn和transformer,同时保持计算效率。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

羞儿

写作是兴趣,打赏看心情

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

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

打赏作者

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

抵扣说明:

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

余额充值