pytorch数据集处理

一、Dataset

torch.utils.data.Dataset 是 PyTorch 中的一个非常核心的类,用于表示一个数据集。它是所有自定义数据集类的基类,通过继承这个类并实现其两个主要方法(__len__ 和 __getitem__),可以轻松地创建自定义数据集。

主要方法

  • __len__:返回数据集中样本的总数。这个方法的实现对于 PyTorch 的 DataLoader 能够正确地遍历数据集是必需的。
  • __getitem__:根据给定的索引返回数据集中的单个样本。这个方法应该支持从 0 到 len(self)-1 的索引,并且返回的数据应该是一个可以被 DataLoader 处理的格式,通常是一个元组(tuple),包含数据和标签(如果有的话)。

使用场景

当你需要处理的数据集不是 PyTorch 官方已经支持的数据集(如 ImageNet, CIFAR-10 等),或者你需要对已有数据集进行预处理、增强等操作时,就可以通过继承 Dataset 类来创建自定义数据集。

示例

下面是一个简单的自定义数据集类的示例,假设我们有一个文本数据集,每个样本是一个文本字符串,我们需要将其转换为张量(Tensor)以便进行后续处理。

import torch  
from torch.utils.data import Dataset  
  
class TextDataset(Dataset):  
    def __init__(self, texts, transform=None):  
        """  
        texts: 一个包含文本字符串的列表  
        transform: 一个可选的转换函数,用于对文本进行预处理  
        """  
        self.texts = texts  
        self.transform = transform  
  
    def __len__(self):  
        return len(self.texts)  
  
    def __getitem__(self, idx):  
        text = self.texts[idx]  
        if self.transform:  
            text = self.transform(text)  # 假设 transform 函数可以将文本转换为张量  
        return text  # 这里假设 transform 已经将文本转换为了张量  
  
# 示例使用  
texts = ["hello world", "pytorch is great", "data science is fun"]  
# 假设我们有一个 transform 函数可以将文本转换为张量(这里省略实现)  
dataset = TextDataset(texts)  
  
# 接下来可以使用 DataLoader 来加载这个数据集  
from torch.utils.data import DataLoader  
  
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)  
  
for batch in dataloader:  
    print(batch)  # 这里会打印出转换后的文本张量,具体取决于 transform 的实现

注意:在上面的示例中,transform 函数的实现被省略了,因为它依赖于具体的文本预处理需求。在实际应用中,你可能需要实现一个或多个转换函数,用于将文本转换为张量、进行分词、编码等操作。

二、DataLoader

DataLoader 是 PyTorch 中一个非常重要的类,它位于 torch.utils.data 模块下。DataLoader 提供了一个可迭代的对象,能够高效地加载数据集,并支持自动批处理(batching)、打乱数据(shuffling)、多进程数据加载等功能。这些特性使得 DataLoader 成为训练深度学习模型时处理数据的首选工具。

基本用法

要使用 DataLoader,你首先需要有一个继承自 torch.utils.data.Dataset 的数据集类。然后,你可以通过传递这个数据集类的实例以及其它一些可选参数(如批量大小 batch_size、是否打乱数据 shuffle、是否使用多进程 num_workers 等)来创建 DataLoader 的实例。

from torch.utils.data import DataLoader, Dataset  
  
# 假设你已经有了一个自定义的数据集类 MyDataset  
# dataset = MyDataset(...)  
  
# 创建 DataLoader  
data_loader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)  
  
# 在训练循环中使用 DataLoader  
for batch_idx, (data, target) in enumerate(data_loader):  
    # 这里的 data 和 target 分别是当前批次的数据和标签  
    # 执行模型的前向传播、计算损失、反向传播等步骤  
    pass

重要参数

  • dataset(Dataset):加载数据的数据集对象。
  • batch_size(int, optional):每个批次加载的样本数。默认值为1。
  • shuffle(bool, optional):在每个 epoch 开始时,是否打乱数据。默认为 False。
  • sampler(Sampler, optional):定义从数据集中抽取样本的策略。如果指定,shuffle 必须为 False。
  • num_workers(int, optional):用于数据加载的子进程数。默认为0,表示数据将在主进程中加载。
  • collate_fn(callable, optional):将多个样本合并成一个批次的函数。如果未指定,将使用默认的数据合并方式。
  • pin_memory(bool, optional):如果设置为 True,并且你的数据在 CPU 上,那么 DataLoader 将会在返回之前,将 Tensor 拷贝到 CUDA 的 pinned memory 中,从而加快数据到 GPU 的传输速度。
  • drop_last(bool, optional):如果数据集大小不能被 batch_size 整除,是否丢弃最后一个不完整的批次。默认为 False。

多进程数据加载

当 num_workers 大于0时,DataLoader 将使用多进程来加速数据的加载。每个工作进程都会负责加载数据集的一个子集,然后将加载好的数据转移到主进程中,以便进行模型的训练。这种方式可以显著提高数据加载的效率,尤其是在处理大型数据集时。

然而,需要注意的是,多进程数据加载可能会引入一些额外的复杂性,比如进程间的通信开销、数据同步问题以及可能的错误(如 Python 的 pickle 序列化问题)。因此,在使用多进程数据加载时,需要仔细考虑这些潜在的问题,并确保你的数据集和代码能够正确地处理它们。

总之,DataLoader 是 PyTorch 中一个功能强大的工具,能够极大地简化数据加载和处理的过程,使得训练深度学习模型变得更加高效和便捷。

三、transforms

torchvision.transforms 是 PyTorch 生态系统中的一个重要模块,它提供了一系列对图像进行预处理的类和函数。这些变换(transforms)可以单独使用,也可以组合起来形成一个转换流水线(transform pipeline),用于在图像数据被送入模型之前对其进行必要的处理。

常见的变换(Transforms)

  • 裁剪(Cropping):如 CenterCropRandomCrop 等,用于裁剪图像的特定区域。
  • 调整大小(Resizing):如 ResizeScale(已弃用)等,用于改变图像的尺寸。
  • 翻转(Flipping):如 RandomHorizontalFlipRandomVerticalFlip,用于随机水平或垂直翻转图像。
  • 旋转(Rotation):如 RandomRotation,用于随机旋转图像一定的角度。
  • 色彩变换(Color Transformations):如 GrayscaleRandomGrayscaleColorJitter 等,用于改变图像的色彩空间或颜色属性。
  • 归一化(Normalization):如 Normalize,用于对图像进行归一化处理,即将图像的像素值缩放到一定的范围内,并减去均值,除以标准差,这是训练深度学习模型时的常见步骤。
  • 转换数据类型(ToTensor):如 ToTensor,用于将 PIL Image 或 NumPy ndarray 转换为 FloatTensor,并自动将像素值缩放到 [0.0, 1.0] 范围内。
  • 组合变换(Compose)Compose 是一个特殊的变换,它允许你将多个变换组合成一个变换序列,然后一次性应用到图像上。

使用示例

下面是一个使用 torchvision.transforms 对图像进行预处理的示例:

import torchvision.transforms as transforms  
  
# 定义一个转换流水线  
transform = transforms.Compose([  
    transforms.Resize((256, 256)),    # 将图像大小调整为256x256  
    transforms.CenterCrop(224),       # 从中心裁剪出224x224的图像  
    transforms.ToTensor(),            # 将图像转换为Tensor  
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),  # 归一化  
])  
  
# 假设你已经有了一个 PIL Image 对象 image  
# 使用定义好的转换流水线对图像进行预处理  
transformed_image = transform(image)  
  
# transformed_image 现在是一个 FloatTensor,已经准备好被送入模型进行训练或推理

torchvision.transforms 提供的变换操作非常灵活,你可以根据自己的需求选择和组合不同的变换,以实现对图像数据的最佳预处理。 

四、GPU加速

PyTorch中的GPU加速是指利用图形处理器(GPU)的强大并行计算能力来加速数据的处理和计算过程,这在深度学习模型的训练和推理中尤为重要。以下是在PyTorch中实现GPU加速的详细步骤和要点:

检查GPU可用性

首先,需要检查系统中是否有可用的CUDA支持的GPU。这可以通过torch.cuda.is_available()函数来实现:

import torch  
  
if torch.cuda.is_available():  
    print("GPU is available.")  
    print(f"Number of available GPUs: {torch.cuda.device_count()}")  
    for i in range(torch.cuda.device_count()):  
        print(f"GPU {i}: {torch.cuda.get_device_name(i)}")  
else:  
    print("GPU is not available. Please check your CUDA installation.")

指定设备并转移数据

如果GPU可用,接下来需要创建一个设备对象,用于指定后续操作(如张量和模型)应该在哪个设备上进行。然后,使用.to(device)方法将张量和模型转移到GPU上:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")  
  
# 假设tensor是一个PyTorch张量  
tensor_gpu = tensor.to(device)  
  
# 假设model是一个PyTorch模型  
model.to(device)

执行计算

一旦数据和模型都被转移到GPU上,所有的计算操作(如前向传播、反向传播等)都将自动在GPU上进行,从而利用GPU的并行计算能力加速计算过程。

# 假设inputs是已经转移到GPU上的输入数据  
outputs = model(inputs)

注意事项

  1. 内存管理:GPU的显存(与CPU的内存不同)可能相对较小,这限制了能够同时处理的数据量大小。因此,在设计模型和选择批量大小时,需要考虑到显存的限制。
  2. 数据传输开销:数据在CPU和GPU之间的传输是相对耗时的。因此,应该尽量减少这种数据传输的次数,例如通过一次性传输多个批次的数据到GPU上。
  3. 并行化策略:虽然GPU能够并行处理大量数据,但也需要合理的并行化策略来最大化其性能。例如,可以通过调整模型的并行度(如数据并行、模型并行等)来优化计算效率。
  4. CUDA版本兼容性:确保安装的PyTorch版本与CUDA版本兼容。不匹配的版本可能会导致性能下降或无法利用GPU进行加速。

性能监控与优化

PyTorch提供了一些工具来监控GPU的性能,如torch.cuda.memory_allocated()torch.cuda.memory_reserved()等函数,这些函数可以帮助用户了解当前GPU的显存使用情况。此外,还可以通过分析模型的计算图和性能瓶颈来进一步优化模型的性能。

综上所述,PyTorch中的GPU加速是通过将数据和模型转移到GPU上,并利用GPU的并行计算能力来加速计算过程的一种技术。通过合理的设备配置、数据管理和并行化策略,可以显著提高深度学习模型的训练和推理效率。

 

五、如何将 torch.utils.data.Dataset 转换为 PyTorch 模型

实际上,torch.utils.data.Dataset 并不直接转换为 PyTorch 模型。Dataset 是 PyTorch 中用于表示数据集的类,它主要负责数据的加载和预处理,而不涉及模型的定义或训练过程。

要将数据集用于训练 PyTorch 模型,你需要做以下几件事:

  1. 定义数据集:通过继承 torch.utils.data.Dataset 并实现 __len__ 和 __getitem__ 方法来创建一个自定义数据集。

  2. 定义模型:使用 PyTorch 的 torch.nn.Module 创建一个神经网络模型。这个模型将包含你的网络架构,比如卷积层、全连接层等。

  3. 准备数据加载器:使用 torch.utils.data.DataLoader 来包装你的数据集。DataLoader 提供了批量加载数据、打乱数据、多进程加载等功能,非常适合用于训练。

  4. 训练模型:编写训练循环,使用数据加载器迭代地提供数据给模型,进行前向传播、计算损失、进行反向传播和更新模型参数。

下面是一个简化的示例,展示了这些步骤:

import torch  
from torch.utils.data import Dataset, DataLoader  
from torch.nn import Module, Linear, ReLU  
from torch.optim import SGD  
  
# 假设的自定义数据集  
class MyDataset(Dataset):  
    def __init__(self):  
        # 假设数据是简单的随机生成  
        self.data = torch.randn(100, 10)  # 100个样本,每个样本10个特征  
        self.targets = torch.randint(0, 2, (100,))  # 100个二进制标签  
  
    def __len__(self):  
        return len(self.data)  
  
    def __getitem__(self, idx):  
        return self.data[idx], self.targets[idx]  
  
# 定义模型  
class MyModel(Module):  
    def __init__(self):  
        super(MyModel, self).__init__()  
        self.fc1 = Linear(10, 5)  # 输入层到隐藏层  
        self.relu = ReLU()  
        self.fc2 = Linear(5, 2)   # 隐藏层到输出层  
  
    def forward(self, x):  
        x = self.relu(self.fc1(x))  
        x = self.fc2(x)  
        return x  
  
# 实例化数据集和数据加载器  
dataset = MyDataset()  
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)  
  
# 实例化模型和优化器  
model = MyModel()  
optimizer = SGD(model.parameters(), lr=0.01)  
  
# 假设的损失函数  
criterion = torch.nn.CrossEntropyLoss()  
  
# 训练模型(简化版)  
num_epochs = 5  
for epoch in range(num_epochs):  
    for inputs, labels in dataloader:  
        # 前向传播  
        outputs = model(inputs)  
        loss = criterion(outputs, labels)  
  
        # 反向传播和优化  
        optimizer.zero_grad()  
        loss.backward()  
        optimizer.step()  
  
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

在这个示例中,MyDataset 是一个简单的数据集,它随机生成了一些数据和标签。MyModel 是一个简单的神经网络模型,它有两个全连接层和一个ReLU激活函数。我们使用 DataLoader 来加载数据,并用 SGD 优化器和交叉熵损失函数来训练模型。 

六、TensorBoardX

TensorBoardX 是一个针对 PyTorch 深度学习框架设计的可视化工具,它提供了类似于 TensorFlow 的 TensorBoard 的功能,使得 PyTorch 用户能够方便地记录和可视化训练过程中的各种数据。以下是关于 TensorBoardX 的详细介绍:

TensorBoardX 的功能

  1. 日志记录:TensorBoardX 可以记录模型训练过程中的各种参数,如损失函数、准确率等,这些数据对于模型的调试和优化至关重要。
  2. 可视化:它提供了丰富的可视化选项,包括标量(如损失和准确率)、图像、直方图等。用户可以通过 TensorBoard 的界面直观地观察这些数据的变化趋势,从而更好地理解模型的训练过程。
  3. 计算图:TensorBoardX 能够展示模型的计算图,这有助于研究人员和开发者理解模型的结构和数据流,进而进行针对性的优化。
  4. 超参数调整:通过记录不同的超参数设置对训练结果的影响,TensorBoardX 有助于用户进行超参数的调整和选择,从而找到最优的模型配置。
  5. 兼容性:TensorBoardX 能够与 PyTorch 无缝协作,同时生成的日志文件也可以直接在 TensorBoard 中查看,这为用户提供了极大的便利。
  6. 易于使用:TensorBoardX 的 API 简单直观,容易集成到现有的 PyTorch 代码中。用户只需几行代码即可开始记录数据,并在 TensorBoard 中进行可视化。
  7. 扩展性:TensorBoardX 支持自定义插件,使得用户可以根据需求扩展其功能。这为高级用户提供了更多的灵活性和可能性。

TensorBoardX 的安装与使用

  1. 安装:TensorBoardX 可以通过 pip 进行安装。用户只需在命令行中输入 pip install tensorboardX 即可完成安装。需要注意的是,TensorBoardX 依赖于 TensorBoard 和 PyTorch,因此安装前请确保已正确安装这些依赖项。

  2. 使用:使用 TensorBoardX 进行数据记录和可视化的基本步骤包括创建 SummaryWriter 实例、调用 add_something 方法向日志中写入数据以及启动 TensorBoard 查看数据。以下是一个简单的示例:

from tensorboardX import SummaryWriter  

# 创建一个 SummaryWriter 实例,用于记录数据  
writer = SummaryWriter('runs/exp1')  

# 假设我们有一个损失值  
loss_value = 0.23  

# 记录一个标量数据  
writer.add_scalar('Loss', loss_value, global_step=0)  

# 关闭 writer(可选,但推荐在不再需要记录数据时调用)  
writer.close()  

# 启动 TensorBoard 查看数据  
# 在命令行中输入:tensorboard --logdir=runs
  1. 在这个示例中,我们首先创建了一个 SummaryWriter 实例,并指定了一个日志目录(runs/exp1)。然后,我们使用 add_scalar 方法记录了一个损失值,并通过 global_step 参数指定了当前的训练步数。最后,我们关闭了 SummaryWriter 实例(虽然这一步是可选的,但推荐在不再需要记录数据时调用以避免资源泄露)。之后,我们可以通过在命令行中输入 tensorboard --logdir=runs 来启动 TensorBoard,并通过浏览器访问 http://localhost:6006 来查看记录的数据。

总结

TensorBoardX 是 PyTorch 用户的一种强大工具,它通过可视化和记录训练过程中的各种指标,帮助用户更好地理解和优化他们的模型。无论是对于初学者还是资深研究人员和开发者来说,TensorBoardX 都是一个不可或缺的工具。

七、Visdom

Visdom是一个功能强大的实时交互性数据可视化工具,主要用于深度学习中的实验和结果展示。它最初由Facebook人工智能研究院(FAIR)开发,并随后成为了一个开源项目,广泛应用于各种科研和工程实践中。以下是对Visdom的详细介绍:

基本功能

  1. 实时可视化:Visdom允许用户通过Web浏览器实时监控训练过程中的损失函数、准确率等指标的变化,从而帮助用户更好地了解模型的训练情况。
  2. 交互性:Visdom界面支持用户与图表进行交互,如放大、缩小、平移图表,以及查看特定数据点的详细信息。
  3. 多窗口支持:用户可以创建多个窗口,每个窗口用于显示不同的数据,这对于同时监视多个实验或模型非常有用。
  4. 图像和文本显示:Visdom支持图像和文本的展示,使用户能够查看模型生成的图像、输入数据等。
  5. 灵活的数据输入:用户可以通过Python、Lua等多种编程语言将数据传输到Visdom服务器,方便与不同深度学习框架集成。

主要特点

  1. 实时性:Visdom的实时性使其非常适合用于深度学习训练过程的监控,用户可以即时看到训练指标的变化。
  2. 可交互性:强大的交互功能让用户能够深入探索数据,发现隐藏的信息和趋势。
  3. 可扩展性:Visdom支持多种数据类型和可视化方式,且易于扩展,满足用户多样化的需求。
  4. 远程访问:Visdom支持远程访问,用户可以在不同设备上打开Visdom界面,监控和控制可视化,这对于分布式训练或需要远程监控的情况非常有用。

应用场景

Visdom在深度学习研究和应用中有着广泛的应用。它可用于实时监控训练过程中的损失曲线、准确率和其他指标,帮助用户了解模型的性能。同时,用户还可以使用Visdom可视化数据集中的样本、特征分布以及任何需要观察的数据。此外,Visdom还支持图像的可视化,用户可以显示模型生成的图像、输入图像以及其他与图像相关的数据。

使用方法

  1. 安装Visdom:可以通过pip命令安装Visdom,例如pip install visdom
  2. 启动Visdom服务器:在终端中运行python -m visdom.server命令启动Visdom服务器,并根据提示在浏览器中打开相应的URL以访问Visdom界面。
  3. 进行可视化:在代码中创建Visdom客户端,并使用Visdom提供的各种函数(如lineimagebar等)将数据传输到Visdom服务器,从而在Visdom界面上进行可视化。

注意事项

  1. 确保正确安装:在使用Visdom之前,请确保已正确安装Visdom和相关的依赖项。
  2. 避免资源占用:当可视化大型数据集时,请避免将所有数据一次性传递给Visdom,以免导致内存问题。可以选择性地抽样或可视化数据的子集。
  3. 安全访问:如果在公共网络上部署Visdom服务器,请确保设置了适当的安全措施,以防止未经授权的访问。

综上所述,Visdom是一个功能强大的深度学习可视化工具,它通过实时、交互和可扩展的数据可视化功能,帮助用户更好地理解和优化深度学习模型。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一个开源的机器学习库,内置丰富的函数和工具包用于数据集加载、数据预处理、模型构建、训练和评估。数据集是机器学习模型的重要组成部分,PyTorch提供了多种方法用于加载数据集,包括内置的函数和可定制的方法,让用户可以根据自己的需求和数据集特性来选择适合的方式。 内置函数 PyTorch提供了内置的函数用于加载常见的数据集,如MNIST、CIFAR-10、ImageNet等。这些函数通常包括下载数据集、转换为Tensor格式、划分为训练集和测试集等步骤,使用简单方便,适合快速上手使用。 可定制方法 如果内置函数不能满足需求,PyTorch也提供了许多可定制的方法。最常用的是Dataset和DataLoader类。Dataset类是抽象类,用户需要继承这个类并实现getitem和len方法来定义自己的数据集。DataLoader类用于生成一个迭代器,用户可以设置批量大小、并行加载、随机采样等参数。 除此之外,PyTorch还提供了其它一些用于数据集处理的工具,如transforms模块、Sampler类、collate_fn函数等,可以用于数据增强、数据集分块和数据集拼接等场景。 总结 PyTorch提供了内置函数和可定制方法用于加载数据集,用户可以根据自己的需求和数据集特性来选择适合的方式。使用内置函数可以快速上手,使用可定制方法可以更加灵活和高效。对于多样化的数据集PyTorch还提供了多个处理工具,可以用于数据增强、数据集分块和数据集拼接等场景。 ### 回答2: PyTorch是一种基于Python的开源机器学习库,它可以用于构建各种机器学习模型。在PyTorch中,数据集加载是一个非常重要的部分,因为机器学习模型需要大量的数据来进行训练。 在PyTorch中,数据集加载可以通过DataLoader类来实现。DataLoader是一个Python迭代器,它可以加载大量的数据集,并将其分成小批量进行训练。这样可以避免一次性将整个数据集加载到内存中,从而节省内存空间。 首先,我们需要将数据集加载到内存或磁盘中,并将其转换为PyTorch数据集类的对象。PyTorch提供了两种数据集类:Dataset和IterableDataset。其中,Dataset类是一种基于索引的数据集类,它可以通过索引来访问数据集中的每个数据样本;而IterableDataset是一种基于迭代器的数据集类,它可以像Python中的迭代器一样使用。 然后,我们可以使用DataLoader类来加载数据集。DataLoader类有很多参数,包括batch_size(表示每个小批量包含的样本数)、shuffle(表示是否随机打乱数据集顺序)、num_workers(表示使用多少个工作线程来加载数据集)等。 在使用DataLoader类加载数据集时,我们可以通过for循环来迭代数据集中的每个小批量,并将其传递给机器学习模型进行训练。 总之,PyTorch数据集加载是非常灵活和易于使用的。通过使用DataLoader类和PyTorch提供的数据集类,我们可以轻松地加载和处理大量的数据集,并将其用于训练各种机器学习模型。 ### 回答3: Pytorch是一个使用Python作为开发语言的深度学习框架,提供了非常强大的数据加载和预处理工具。在Pytorch中,数据集加载主要通过两个类来实现,分别是Dataset和DataLoader。Dataset类负责加载和处理数据集,而DataLoader类则负责将处理后的数据安装指定的batch_size分批加载到内存中,避免了内存不足的问题。 Dataset类是一个抽象类,需要根据具体的数据集来实现其中的方法。一般而言,Dataset类中需要实现__len__()方法和__getitem__()方法,分别用来获取数据集的长度和获取具体的数据样本。 DataLoader类则负责对数据集进行batch处理,这样可以充分利用系统的存储和计算资源,提高了模型的训练速度。在使用DataLoader时,需要指定batch_size、shuffle和num_workers等参数,其中num_workers可以指定使用多少个进程来装载数据,从而进一步提高了数据装载的效率。 在数据集加载过程中,可以使用Pytorch提供的transforms模块来进行数据的预处理,如改变图像尺寸、随机翻转、归一化等操作,从而增加模型的泛化能力和准确性。 总之,Pytorch数据集加载和预处理方面提供了非常强大的工具,只需要实现一些简单的代码,就能轻松地完成数据的加载和预处理,从而为模型的训练和测试提供了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值