【动手学深度学习】七、现代卷积神经网络

一、LeNet

1、 简介:

LeNet模型是在1998年提出的一种图像分类模型,应用于支票或邮件编码上的手写数字的识别,也被认为是最早的卷积神经网络(CNN),为后续CNN的发展奠定了基础,作者LeCun Y也被誉为卷积神经网络之父。LeNet之后一直直到2012年的AlexNet模型在ImageNet比赛上表现优秀,使得沉寂了14年的卷积神经网络再次成为研究热点。

LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.

2、LeNet网络结构

在这里插入图片描述

如图所示,LeNet共分为7层,分别是:

INPUT(输入层)

输入图像的尺寸为32X32,是单通道的灰色图像。

C1(卷积层)

使用了6个大小为5×5的卷积核,步长为1,卷积后得到6张28×28的特征图。

S2(池化层)

使用了6个2×2 的平均池化,步长为2,池化后得到6张14×14的特征图。

C3(卷积层)

使用了16个大小为5×5的卷积核,步长为1,得到 16 张10×10的特征图。

在卷积层C1中,卷积核有6种,而输入图像只有1张,因此只需要将6个卷积核分别对1张图像进行卷积操作,最后得到6张特征图。那么输入6张图像的话应该怎么处理呢?
在这里,采用的方法是"每个卷积核对多张特征图"进行处理,例如,编号为0的卷积核处理编号为0、1、2的特征图,编号为15的卷积核处理编号为0、1、2、3、4、5的特征图…具体的对应规则如下:

原文链接:https://blog.csdn.net/qq_40714949/article/details/109863595

S4(池化层)

使用16个2×2的平均池化,步长为2,池化后得到16张5×5 的特征图。

C5(卷积层)

使用120个大小为5×5的卷积核,步长为1,卷积后得到120张1×1的特征图。

F6(全连接层)

输入维度120,输出维度是84(对应7x12 的比特图)。

OUTPUT(输出层)

使用高斯核函数,输入维度84,输出维度是10(对应数字 0 到 9)。实际上就是一个线性层

import torch
from torch import nn, optim


class LeNet(nn.Module):

    def __init__(self) -> None:
        super().__init__()
        self.model = nn.Sequential(  # (-1,1,28,28)
            nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2),  # (-1,6,28,28)
            nn.Sigmoid(),
            nn.AvgPool2d(kernel_size=2, stride=2),  # (-1,6,14,14)
            nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5),  # (-1,16,10,10)
            nn.Sigmoid(),
            nn.AvgPool2d(kernel_size=2, stride=2),  # (-1,16,5,5)
            nn.Flatten(),
            nn.Linear(in_features=16 * 5 * 5, out_features=120),  # (-1,120)
            nn.Sigmoid(),
            nn.Linear(120, 84),  # (-1,84)
            nn.Sigmoid(),
            nn.Linear(in_features=84, out_features=10)  # (-1,10)
        )

    def forward(self, x):
        return self.model(x)


leNet = LeNet()
print(leNet)

二、AlexNet

1、简介

AlexNet是第一个深度卷积网络模型,赢得了2012年ImageNet图像分类竞赛的冠军,自98年的LeNet后再次将深度学习研究引热,创造性的提出了很多方法且影响至今,如使用GPU进行训练使用ReLU 作为非线性激活函数使用 Dropout 防止过拟合使用数据增强来提高模型准确率等。

Krizhevsky A, Sutskever I, Hinton G E, 2012. ImageNet classification with deep convolutional neural networks[C]//Advances in Neural Information Processing Systems 25. 1106-1114.
论文地址

2、AlexNet网络结构

在这里插入图片描述
包括5个卷积层、3个全连接层。分别部署在2个GPU上,这里写在一起即可。
用一个GPU的结构:
在这里插入图片描述
C1:卷积–>ReLU–>池化

输入:RGB三通道,即3×224×224的图像
卷积层:96个大小为11×11的卷积核,步长4,填充2
输出:96×55×55
ReLu激活
最大池化:核大小3×3,步长2(重叠池化)
输出:96×27×27

C2:卷积–>ReLU–>池化

输入:96×27×27
卷积层:使用256个大小为5×5的卷积核,步长1,填充2
输出:256×27×27
ReLu激活
最大池化核:大小3×3,步长2(重叠池化)
输出:256×13×13

C3:卷积–>ReLU

输入:256×13×13
卷积层:使用384个大小为3×3的卷积核,步长1,填充1
输出:384×13×13
ReLu激活

C4:卷积–>ReLU

输入:384×13×13
卷积层:使用384个大小为3×3的卷积核,步长1,填充1
输出:384×13×13
ReLu激活

C5:卷积–>ReLU–>池化

输入:384×13×13;
卷积层:使用256个大小为3×3的卷积核,步长1,填充1
输出:256×13×13特征
ReLu激活
最大池化:核大小3×3,步长2(重叠池化)
输出:256×6×6

FC6:全连接–>>ReLU–>Dropout

Droupout随机置0
输入25666,输出1×1×4096
ReLu激活

FC7:全连接–>>ReLU–>Dropout

Droupout随机置0
输入1×1×4096,输出1×1×4096
ReLu激活

FC8:全连接

输入1×1×4096,输出分类数

class AlexNet(nn.Module):
    def __init__(self, num_classes: int = 1000, dropout: float = 0.5) -> None:
        super().__init__()
        self.features = nn.Sequential(  # (-1,3,224,224)
            nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),  # (-1,96,55,55)
            nn.MaxPool2d(kernel_size=3, stride=2),  # (-1,96,27,27)
            nn.Conv2d(in_channels=96, out_channels=256, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),  # (-1,256,27,27)
            nn.MaxPool2d(kernel_size=3, stride=2),  # (-1,256,13,13)
            nn.Conv2d(in_channels=256, out_channels=384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),  # (-1,384,13,13)
            nn.Conv2d(in_channels=384, out_channels=384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),  # (-1,384,13,13)
            nn.Conv2d(in_channels=384, out_channels=256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),  # (-1,256,13,13)
            nn.MaxPool2d(kernel_size=3, stride=2),  # (-1,256,6,6)
        )
        self.classifier = nn.Sequential(
            nn.Dropout(p=dropout),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(p=dropout),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes)
        )

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.features(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

3、与LeNet的改进

AlexNet和LeNet的设计理念非常相似,但也存在显著差异。

  • AlexNet比相对较小的LeNet5要深得多。AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。
  • AlexNet使用ReLU而不是sigmoid作为其激活函数。ReLU 能够提高计算速度的同时,有效地解决了梯度消失问题,从而使得训练更加高效。
  • 局部响应归一化(Local response nomalization,LRN)。LRN层旨在模拟生物神经系统中的激励侧抑制机制,通过对局部神经元的活动进行归一化处理来增强模型的泛化能力。在后来VGG的论文中发现没什么用,还会增加参数。
  • 重叠池化(Overlapping Pooling)。池化步长小于池化窗口的大小。现在也不再被采用。
  • 在训练阶段全连接层使用了Dropout降低过拟合,每次迭代随机使一半的神经元弃用
  • 分布式训练。在当时GPU性能并不高,内存比较小,AlexNet在使用GPU进行训练时,可将卷积层和全连接层分别放到不同的GPU上进行并行计算,从而大大加快了训练速度。
  • 数据增强。

1、从256×256中随机裁剪出224×224再水平翻转。
2、第二种数据增强方式是改变训练图像中RGB通道的强度。在整个ImageNet训练集中的RGB像素值集合上执行PCA,在每张训练图像中,我们都会添加所主成分的倍数
3、网络结构被切割为两部分,每个GPU单独计算一半的通道数,其中会互相通信三次。

4、AlexNet的优缺点

优点:

  • 准确性:AlexNet在当时的ImageNet图像分类挑战赛上取得了显著的准确率提升,大幅领先于其他竞争模型。它的深层结构和创新技术(如ReLU激活函数、LRN、Dropout等)使得其在图像分类任务上具有出色的性能。

  • 特征提取能力:通过多个卷积层和池化层的组合,AlexNet能够有效地提取多层次的抽象特征。这种能力使得它在处理复杂图像数据时表现出色,并为后续的深度学习模型奠定了基础。

  • 并行计算加速:AlexNet是首个充分利用GPU并行计算能力的深度学习模型。通过在两个GPU上进行并行计算,它极大地加快了模型的训练速度,为大规模深度模型的训练提供了可行性。

  • 数据增强和正则化:AlexNet引入了数据增强和正则化技术,如随机翻转、裁剪、旋转、LRN和Dropout等。这些技术有助于增加数据的多样性和数量,减轻过拟合问题,并提高模型的泛化能力。

缺点:

  • 较大的计算资源需求:AlexNet是一个较深、复杂的模型,需要大量的计算资源和训练时间进行训练。这对于一些资源受限的环境可能会造成挑战。

  • 参数量较大:AlexNet具有较大的模型参数量,这使得它需要更多的存储空间和计算资源来进行训练和推理。在一些轻量级设备上应用时可能面临性能和资源消耗方面的限制。

  • 容易过拟合:由于模型的复杂性和参数量较大,AlexNet容易在小规模数据集上出现过拟合的问题。为了解决这个问题,需要使用正则化技术如Dropout等来减少过拟合的风险。

  • 局限性:尽管AlexNet在图像分类任务上取得了巨大成功,但它在其他计算机视觉任务(如目标检测、语义分割等)上的应用相对有限。新的网络架构和技术被提出来解决这些任务,并取得了更好的效果。

三、VGG

1、简介

VGGNet是牛津大学视觉几何组(Visual Geometry Group)提出的模型,该模型在2014ImageNet图像分类与定位挑战赛 ILSVRC-2014中取得在分类任务第二,定位任务第一的优异成绩。VGGNet突出的贡献是证明了很小的卷积,通过增加网络深度可以有效提高性能。VGG很好的继承了Alexnet的衣钵同时拥有着鲜明的特点。相比Alexnet ,VGG使用了更深的网络结构,证明了增加网络深度能够在一定程度上影响网络性能。

VGG就是五次卷积的卷积神经网络。

论文地址

论文作者一共实验了6种网络结构,其中VGG16和VGG19分类效果最好。
(A-LRN)在第一组的卷积神经网络的基础上加了LRN(现在已经不是主流了,LRN是Alexnet中提出的方法,在AlexNet中有不错的表现 )

原始输入:224×224
只通过最大池化进行高宽减半,卷积不改变图片尺寸?
在这里插入图片描述

3、VGG vs AlexNet

网络结构:

  • AlexNet:较浅,包含5个卷积层和3个全连接层。
  • VGG:较深,VGG16包含13个卷积层和3个全连接层,VGG19包含16个卷积层和3个全连接层。

卷积核和池化层:

  • AlexNet:使用不同尺寸的卷积核和局部响应归一化(LRN)。
  • VGG:统一使用3x3的卷积核和2x2的最大池化层。

局部响应归一化(LRN):

  • AlexNet:在每个卷积层后加入了局部响应归一化层。
  • VGG:没有使用LRN,只使用了卷积层和池化层。

VGG并没有在第一个卷积层就使用很大的卷积核(AlexNet在第一个卷积层使用的卷积核大小为 11×11,步长为4),VGG网络全部使用 3×3 的卷积核,步长均为1,并且在输入层之后,可能连续会有多个卷积层的堆叠(中间不再pooling).

这样做的效果是:当有两个卷积层堆叠时,第二个卷积层的 3×3 感受野映射到输入层就是 5×5;当有3个卷积层堆叠时,第三个卷积层的 3×3 感受野映射到输入层就是 7×7。简单理解,3个步长为1的 3x3卷积核的一层层叠加作用可看成一个大小为7的感受野,也就是说3个 3x3 连续卷积相当于一个 7x7 卷积。

将大的卷积核拆分成小的卷积核搭配多个堆叠的卷积层,这样做的好处有以下几点:

  • 增强特征学习能力。多个堆叠的卷积层可以使用多次ReLU激活函数,相比只有一层使用一次ReLU激活函数,前者使得网络对特征的学习能力更强;
  • 降低网络参数数量。

4、VGG优势

  • VGGNet的结构非常简洁,整个网络都使用 3x3 的卷积和 2x2 的 max pooling;
  • 采用堆叠几个小卷积核的卷积层优于采用大卷积核的卷积层;
  • 验证了通过不断加深网络结构可以提升性能。

四、NiN

NiN块的提出,主要是因为前面所提到的三个网络都含有全连接层。

在这里面含有一个很大的问题:每个卷积层的参数基本都是in×out×k×k,但是最后一个卷积到全连接层之间,有很大的参数。最大的问题是,这个容易带来过拟合。

所以NiN的思想就是不要全连接层

1、NiN块

在这里插入图片描述
NiN 块以⼀个普通卷积层开始,后面是两个 1 × 1 的卷积层。这两个1 × 1 卷积层充当带有 ReLU 激活函数的逐像素全连接层。第⼀层的卷积窗口形状通常由用户设置。随后的卷积窗口形状固定为 1 × 1。

2、NiN架构

没有全连接层,采用交替使用NiN块与步幅为2的最大池化层,最后使用全局平均池化层得到输出。

(全局平均池化:不以窗口的形式取均值,而是以feature map为单位进行均值化。即一个feature map输出一个值。也可以理解为一个通道输出一个值,有多少个通道就输出多少个值。)
在这里插入图片描述
总共采用了四个NiN块,前三个NiN块跟的是maxpool ,最后一块NiN跟的是全局平均池化
在这里插入图片描述

五 、GooLeNet

1、GooLeNet简介

GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量来提升网络性能。但这种方式存在以下问题:

参数太多,如果训练数据集有限,很容易产生过拟合;
网络越大、参数越多,计算复杂度越大,难以应用;
网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

方法:增加网络深度和宽度的同时减少参数,为了减少参数

2、 GooLeNet结构

Inception模型进化史:从GoogLeNet到Inception-ResNet

Inception网络开始于2014年的GoogLeNet,并经历了几次版本的迭代,一直到目前最新的Inception-v4

Inception V1:

Inception-v1就是众人所熟知的GoogLeNet,它夺得了2014年ImageNet竞赛的冠军,它的名字也是为了致敬较早的LeNet网络。
GooLenet网络率先采用了Inception模块,因而又称为Inception网络,后面的版本也是在Inception模块基础上进行改进。
原始的Inception模块如图所示,包含几种不同大小的卷积,即1x1卷积,3x3卷积和5x5卷积,还包括一个3x3的max pooling层。这些卷积层和pooling层得到的特征concat在一起作为最终的输出,也是下一个模块的输入。

Inception原始版本
在这里插入图片描述

Inception改进版本
在这里插入图片描述

采用较大的卷积核计算复杂度较大,只能限制特征的channel数量。
所以GoogLeNet采用了1x1卷积来进行优化,即先采用1x1卷积将特征的channel数降低,然后再进行前面所说的卷积。
这种瓶颈层设计也是后面很多网络所常采用的,如ResNet网络。
1x1卷积的主要目的:为了减少维度,还用于修正线性激活(ReLU)

GoogLeNet网络结构(共22层):
在这里插入图片描述
GoogLeNet网络结构明细表:表中的#3x3 reduce,#5x5 reduce表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。
在这里插入图片描述
在这里插入图片描述

总结

  • GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
  • 网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
  • 虽然移除了全连接,但是网络中依然使用了Dropout ;
  • 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。
    辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。

Inception V2

经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现)
经典神经网络论文超详细解读(四)——InceptionV2-V3学习笔记(翻译+精读+代码复现)

3、Inception结构的主要贡献有两个:

一是使用1x1的卷积来进行升降维;
二是在多个尺寸上同时进行卷积再聚合。
深度笔记|1x1卷积核的作用

3.3 比较
VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

  1. ResNet
    4.1 ResNet简介
    ResNet是一种残差网络,是由来自Microsoft Research的4位学者提出的卷积神经网络,在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。

网络的深度为什么重要?

增加网络的宽度和深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,比如说一个深的网络A和一个浅的网络B,那A的性能至少都能跟B一样,为什么呢?因为就算我们把B的网络参数全部迁移到A的前面几层,而A后面的层只是做一个等价的映射,就达到了B网络的一样的效果。一个比较好的例子就是VGG,该网络就是在AlexNet的基础上通过增加网络深度大幅度提高了网络性能。

https://baike.baidu.com/item/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C/22701838?fr=aladdin

因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

为什么不能简单地增加网络层数?

对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。
对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。

虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfit,因为overfit应该表现为在训练集上表现更好才对。

退化问题说明了深度网络不能很简单地被很好地优化。

作者通过实验:通过浅层网络 + y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。

https://www.cnblogs.com/alanma/p/6877166.html

深度网络的退化问题

网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果,从下图中也可以看出网络越深而效果越好的一个实践证据。

实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。这个现象可以在图中直观看出来:56层的网络比20层网络效果还要差。

这不会是过拟合问题,因为56层网络的训练误差同样高。我们知道深层网络存在着梯度消失或者爆炸的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。

在这里插入图片描述

怎么解决退化问题?

这就要利用深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。
在这里插入图片描述

残差:观测值与估计值之间的差。
这里H(x)就是观测值,x就是估计值(也就是上一层ResNet输出的特征映射)。
我们一般称x为identity Function,它是一个跳跃连接;称F(x)为ResNet Function。
1
2
3
假设F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化。

https://blog.csdn.net/sunny_yeah_/article/details/89430124
https://www.cnblogs.com/alanma/p/6877166.html

4.2 ResNet结构
作者由VGG19设计出了plain 网络和残差网络,如下图中部和右侧网络。然后利用这两种网络进行实验对比。

通过短路机制加入了残差单元,如图所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。

从图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变。下图展示的34-layer的ResNet,还可以构建更深的网络如表所示。从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的feature map数量是比较小的,并且是输出feature map数量的1/4。

不同深度的ResNet
在这里插入图片描述
在这里插入图片描述

设计网络的规则:

对于输出feature map大小相同的层,有相同数量的filters,即channel数相同;
当feature map大小减半时(池化),filters数量翻倍,这保持了网络层的复杂度。
对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。维度不匹配时,同等映射有两种可选方案:

直接通过zero-padding 来增加维度(channel)。
乘以W矩阵投影到新的空间。实现是用1x1卷积实现的,直接改变1x1卷积的filters数目。这种会增加参数。

六 ResNet

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值