【PyTorch】2.1 使用Pytorch构建一个神经网络

no.2 LeNet介绍,以及pytorch,tensorflow v1与v2的介绍 主要集中在Tensorflow的Python Frontend层和layers,这些层是在TensorFlow底层算法引擎的基础之上,使用Python的封装,这导致1.0的使用比较麻烦,理解难度较大。但是,LeNet为卷积神经网络的发展奠定了基础,后续的深度学习研究在此基础上不断发展和完善,从而推动了深度学习技术的快速发展。此外,由于图的构建和执行都是在TensorFlow的计算图模式下进行的,因此可能需要特别注意一些细节,如变量的定义和使用等。由于TensorFlow图的构建需要额外的开销,因此。 阅读详情

2 PyTorch初步应用(一)

2.1 使用Pytorch构建一个神经网络

学习目标:

  • 掌握用Pytorch构建神经网络的基本流程
  • 掌握用Pytorch构建神经网络的实现过程

关于 torch.nn:

  • 使用Pytorch来构建神经网络,主要的工具都在torch.nn包中
  • nn依赖于autograd来定义模型,并对其自动求导

构建神经网络的典型流程

  • 定义一个拥有科学系参数的神经网络
  • 遍历训练数据集
  • 处理输入数据使其流进神经网络
  • 计算损失值
  • 将网络参数的梯度进行反向传播
  • 以一定的规则更新网络的权重

定义一个PyTorch实现的神经网络

五层的CNN

import torch
import torch.nn as nn
import torch.nn.functional as F

#定义一个简单的网络类
class Net(nn.Module):
    def __init__(self):
        """
        五层神经网络
        """
        super(Net,self).__init__()
        #定义第一层卷积神经网络,输入通道维度=1,输出通道维度=6,卷积核大小3*3
        self.conv1=nn.Conv2d(1,6,3)
        #定义第二层卷积神经网络,输入通道维度=6,输出通道维度16,卷积核大小3*3
        self.conv2=nn.Conv2d(6,16,3)
        #定义三层全连接网络
        self.fc1=nn.Linear(16*6*6,120)
        self.fc2=nn.Linear(120,84)
        self.fc3=nn.Linear(84,10)

    def forward(self,x):
        """
        :param x:
        :return:
        """
        #在(2,2)的池化窗口下执行最大池化操作
        x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))#扔进第一个卷积层 -》relu-》池化 2*2的池化
        x=F.max_pool2d(F.relu(self.conv2(x)),2)    #扔进第二个卷积层 -》relu-》池化
        x=x.view(-1,self.num_flat_features(x))
        #将三维的张量设置成两维
        x=F.relu(self.fc1(x))
        x=F.relu(self.fc2(x))
        x=self.fc3(x)
        return x

    def num_flat_features(self,x):
        """
        :param x:把经过卷积之后的张量x,计算其size,x是三维张量,取出后面两个维度
        eg: (2,3,4) 返回3*4=12
        :return:
        """
        #计算size,除了第0个维度上的batch_size
        size=x.size()[1:]
        num_features=1
        for s in size:
            num_features*=s
        return num_features

net=Net()
print("the structure of net:",net)
#输出
the structure of net: Net(
  (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
  (fc1): Linear(in_features=576, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)

获取模型中所有可训练参数

net.parameters()

params=list(net.parameters())
print("len of params:",len(params))
print(params[0].size())
print(params[0])
#输出
len of params: 10
torch.Size([6, 1, 3, 3])
Parameter containing:
......

假设图像的输入尺寸为32*32

input=torch.randn(1,1,32,32)
out=net(input)
print(out)
#输出
tensor([[ 4.0471e-02,  8.6946e-02, -1.8538e-02,  5.5225e-02, -9.2332e-02,
          3.0920e-02, -1.9139e-04, -2.0026e-01, -4.5713e-02,  2.6573e-02]],
       grad_fn=<AddmmBackward0>)

有了输出张量之后,据可以执行梯度归零和反向传播操作

注意:

  • torch.nn构建的神经网络只支持mini-batches的输入,不支持单一样本的输入
  • 比如:nn.Conv2d需要一个4D Tensor,形状为(nSamples,nChannels,Height,Width)如果如数只有但一样会本性是,则需要执行input.unsqueeze(0),主动将3D Tensor扩充成4D Tensor

损失函数

  • 损失函数的输入是一个输入的pair(output,target)然后计算出一个数值来评估output和target之间的差距大小
  • 在torch.nn中有若干不同的损失函数可供使用,比如nn.MSELoss就是计算均方差损失来评估输入和目标值之间的差距
  • 应用nn.MSELoss计算损失的一个例子
input=torch.randn(1,1,32,32)
output=net(input)
target=torch.randn(10)

#改变target的形状为二维张量,为了和output匹配
target=target.view(1,-1)
criterion=nn.MSELoss()
loss=criterion(output,target)
print(loss)

该神经网络的方向传播链条

input->conv2d->relu->maxpool2d
->conv2d->relu->maxpool2d
->view->linear->relu->linear->relu->linear
->MSELoss
->loss

当调用loss.backward()时,整张计算图将对loss进行自动求导,所有属性requires_grad=True的Tensors都将参与梯度求导的运算,并将梯度累加到Tensors中的.grad属性中

output=net(input)
target=torch.randn(10)

#改变target的形状为二维张量,为了和output匹配
target=target.view(1,-1)
criterion=nn.MSELoss()
loss=criterion(output,target)
print(loss)
print(loss.grad_fn)
print(loss.grad_fn.next_functions[0][0])
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])
#输出
tensor(0.6516, grad_fn=<MseLossBackward0>)
<MseLossBackward0 object at 0x0000021826CEEE88>
<AddmmBackward0 object at 0x00000218117E8908>
<AccumulateGrad object at 0x0000021826CEEE88>

反向传播

  • 在PyTorch中执行反向传播非常简便,全部的操作就是loss.backward()
  • 在执行反向传播之前,要先将梯度清零,否则梯度会在不同的批次数据之间被累加
  • 执行一个反向传播的demo
# Pytorch 中执行梯度清零的代码
net.zero_grad()

print('conv1.bias.grad before backward')
print(net.conv1.bias.grad)

#Pytorch中执行反向传播的代码
loss.backward()

print("conv1.bias.grad after backward")
print(net.conv1.bias.grad)

更新为了参数

  • 更新参数最简单的算法就是SGD 随机梯度下降
  • 具体的算法公式表达式为:weight=weight-learning_rate*gradient
  • 首先用传统的Python代码来实现SGD如下:
#使用传统Python代码实现SGD
learning_rate=0.01
for f in net.parameters():
    f.data.sub_(f.grad.data*learning_rate)
  • 使用PyTorch官方推荐的标准代码如下:
#首先导入优化器的包,optim中包含若干常用的优化算法,比如SGD,Adam等
import torch.optim as optim

#通过optim创建优化器对象
optimizer=optim.SGD(net.parameters(),lr=0.01)
#将优化器执行梯度清零的操作
optimizer.zero_grad()
output=net(input)
loss=criterion(output,target)

#对损失值执行反向传播操作
loss.backward()
#参数的更新通过一行标准代码来执行
optimizer.step()
print("DONE")

小节总结

学习构建一个神经网络的典型流程
  • 定义一个拥有可学习参数的神经网络
  • 遍历训练数据集
  • 处理输入数据时期流经神经网络
  • 计算损失值
  • 将网络参数的梯度进行反向传播
  • 以一定的规则更新网络的权重
学习损失函数的定义
  • 在前面的demo中我们使用的都是torch.nn.MSELoss()计算均方误差
  • 通过loss.backward()进行反向传播计算时,整张计算图将对loss进行自动求导,所有属性require_grad=True的Tensors都将参与梯度求导的运算,并将梯度累加到Tensors中的.grad属性中
学习反向传播的计算方法
  • 在Pytorch中执行反向传播非常简便,全部的操作就是loss.backward()
  • 在执行反向传播之前,要先将梯度清零,否则梯度会在不同的不同批次数据之间被累加
net.zero_grad()
loss.backward()
学习参数的更新方法
  • 定义优化器来执行参数的优化与更新
    optimizer=optim.SGD(net.parameters(),lr=0.01)
  • 通过优化器来执行具体的参数更新
    optimizer.step()

本小节涉及的完整代码

import torch
import torch.nn as nn
import torch.nn.functional as F

#定义一个简单的网络类
class Net(nn.Module):
    def __init__(self):
        """
        五层神经网络
        """
        super(Net,self).__init__()
        #定义第一层卷积神经网络,输入通道维度=1,输出通道维度=6,卷积核大小3*3
        self.conv1=nn.Conv2d(1,6,3)
        #定义第二层卷积神经网络,输入通道维度=6,输出通道维度16,卷积核大小3*3
        self.conv2=nn.Conv2d(6,16,3)
        #定义三层全连接网络
        self.fc1=nn.Linear(16*6*6,120)
        self.fc2=nn.Linear(120,84)
        self.fc3=nn.Linear(84,10)

    def forward(self,x):
        """
        :param x:
        :return:
        """
        #在(2,2)的池化窗口下执行最大池化操作
        x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))#扔进第一个卷积层 -》relu-》池化 2*2的池化
        x=F.max_pool2d(F.relu(self.conv2(x)),2)    #扔进第二个卷积层 -》relu-》池化
        x=x.view(-1,self.num_flat_features(x))
        #将三维的张量设置成两维
        x=F.relu(self.fc1(x))
        x=F.relu(self.fc2(x))
        x=self.fc3(x)
        return x

    def num_flat_features(self,x):
        """
        :param x:把经过卷积之后的张量x,计算其size,x是三维张量,取出后面两个维度
        eg: (2,3,4) 返回3*4=12
        :return:
        """
        #计算size,除了第0个维度上的batch_size
        size=x.size()[1:]
        num_features=1
        for s in size:
            num_features*=s
        return num_features

net=Net()
# print("the structure of net:",net)
params=list(net.parameters())
# print("len of params:",len(params))
# print(params[0].size())
# print(params[0])
input=torch.randn(1,1,32,32)
# out=net(input)
# print(out)
# print(out.size())
#
# net.zero_grad()
# out.backward(torch.randn(1,10))

output=net(input)
target=torch.randn(10)

#改变target的形状为二维张量,为了和output匹配
target=target.view(1,-1)
criterion=nn.MSELoss()
# loss=criterion(output,target)
# print(loss)
# print(loss.grad_fn)
# print(loss.grad_fn.next_functions[0][0])
# print(loss.grad_fn.next_functions[0][0].next_functions[0][0])

# Pytorch 中执行梯度清零的代码
# net.zero_grad()
#
# print('conv1.bias.grad before backward')
# print(net.conv1.bias.grad)

#Pytorch中执行反向传播的代码
# loss.backward()
#
# print("conv1.bias.grad after backward")
# print(net.conv1.bias.grad)

#使用传统Python代码实现SGD
# learning_rate=0.01
# for f in net.parameters():
#     f.data.sub_(f.grad.data*learning_rate)


#首先导入优化器的包,optim中包含若干常用的优化算法,比如SGD,Adam等
import torch.optim as optim

#通过optim创建优化器对象
optimizer=optim.SGD(net.parameters(),lr=0.01)
#将优化器执行梯度清零的操作
optimizer.zero_grad()
output=net(input)
loss=criterion(output,target)

#对损失值执行反向传播操作
loss.backward()
#参数的更新通过一行标准代码来执行
optimizer.step()
print("DONE")
pytorch学习笔记二:pytorch构建模型的3种方式 pytorch搭建模型整体上看主要有两种方式,一种是继承torch.nn.Module类,另一种就是直接使用继承自该类的子类:Sequential ,ModuleList,ModuleDict。 一、继承torch.nn.Module类 Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想要的模型。 这里定义的MLP类重载了Module类的__in... 阅读详情

相关推荐

PyTorch 1.2.0 GPU加速深度学习框架实战

PyTorch是Facebook推出的一款开源机器学习框架,因其动态计算图和易于使用的API而受到广泛欢迎。PyTorch 1.2.0版本在保持原有灵活性的基础上,引入了一系列新特性,旨在提升用户体验和性能优化。在传统的静态计算图框架中,如TensorFlow 1.x版本,计算图在程序执行前就已被固定下来,一旦构建完成,无法在运行时修改。这种方法虽然适合批处理任务和静态结构的神经网络,但在需要动态调整网络结构或实现更复杂计算流程的场景下显得不够灵活。

weixin_42515340的博客 1102

PyTorch入门(二)从零开始搭建一个神经网络

从零开始构建一个卷积神经网络

1900的博客 3791

保姆级教程:用STM32CubeMX给STM32F407配置RTC秒中断,并解决掉电时间丢失问题

本文详细介绍了如何使用STM32CubeMX为STM32F407配置RTC秒中断,并解决掉电时间丢失问题。通过硬件原理与软件配置的双视角解析,帮助开发者实现精确计时与时间持久化,适用于物联网设备和工业控制器等场景。

weixin_42519733的博客 137

使用pytorch搭建神经网络

使用pytorch进行机器学习1. Config and Seed2. Transform/Pre-processing3. Dataset4. Dataloader5. Model6. Optimizer7. Loss8. Train9. Val and Save10. Test11. Other11.1 Apex 使用pytorch搭建学习框架中用到的主要结构部分与一些代码的写法。 1. Config and Seed 2. Transform/Pre-processing 3. Dataset 4.

starvapour的博客 4473

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

Rust 在数据科学家中的普及将受到 Polars 的推动,用户会发现从使用 Python 切换到 Rust API 的门槛相对较低——比从 Pandas 切换到 C 的门槛要低得多!在数据科学蓬勃发展的十年里,我所在领域的日常工作主要由像 Python 这样的动态语言或像 R 和 Julia 这样使用即时编译的语言主导。尽管这两个库的功能有很多重叠,但有些人会想要一个像 DuckDB 这样的工具,它拥有更多关系型数据库的陷阱,而有些人则不会。然而,一位受访者正确地指出,基于GPU的库(如cuDF)更快。

sosogod的博客 2467

比利时风电光伏负荷一体化数据集解析与应用

本文深度解析了由比利时输电系统运营商Elia集团提供的风电光伏负荷一体化数据集。该数据集整合了负荷、风电与光伏出力数据,并包含多时间尺度的官方预测值,时间跨度长达四年,是研究能源转型、构建电力预测模型及分析电网运行的宝贵资源。文章详细介绍了数据价值、字段含义、实战应用场景(如预测模型基准测试、风光互补性分析)以及数据处理指南,为相关领域的研究与开发提供了高质量数据基础和实践参考。

weixin_29200741的博客 429

手把手教你使用PyTorch搭建神经网络

使用PyTorch搭建基本神经网络的分步指南。

weixin_39915649的博客 5470

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 413

用Pytorch构建第一个神经网络模型(附案例实战)

PyTorch是一个基于python的科学计算包,主要针对两类人群:作为NumPy的替代品,可以利用GPU的性能进行计算作为一个高灵活性、速度快的深度学习平台在PyTorch中搭建神经网络并使用真实的天气信息预测明天是否会下雨。预处理 CSV 文件并将数据转换为张量使用 PyTorch 构建神经网络模型使用损失函数和优化器来训练模型评估模型并了解分类不平衡的危害在开始构建神经网络之前,首先了解一下几个重要概念。

方见华 1万+

避开PFC设计大坑:从环路分析到参数整定的5个常见误区与解决方案

本文深入解析PFC电路设计中从环路分析到参数整定的5个常见误区,包括电感参数设计、小信号模型适用边界、电压环与电流环耦合效应等。通过实际案例和PSIM仿真数据,提供工程落地的解决方案,帮助工程师避开设计陷阱,提升电路性能与可靠性。

weixin_30666401的博客 325

保姆级教程:用Ansible 2.9自动化配置华为ENSP路由器(附Cloud连接避坑指南)

本文提供了一份详细的Ansible 2.9与华为ENSP路由器自动化配置教程,涵盖环境搭建、网络连通性配置、Playbook开发及典型问题排查。特别针对Cloud连接常见问题提供避坑指南,帮助运维工程师快速掌握网络自动化技能,提升工作效率。

weixin_42561476的博客 376

使用Pytorch构建一个神经网络

关于torch.nn ·使用Pytorch来构建神经网络,主要的工具都在torch.nn包中 ·nn依赖于autograd来定义模型,并对其自动求导 构建神经网络的典型流程 ·定义一个拥有可学习参数的神经网络 ·遍历训练数据集 ·处理输入数据使其流经神经网络 ·计算损失值 ...

weixin_57231611的博客 5229

【BlueZ】编译产物详解:可执行文件/库文件/工具的生成路径与用途

BlueZ二次开发编译产物机制解析 摘要:在BlueZ蓝牙协议栈二次开发中,90%的报错源于对编译产物类型和路径的混淆。本文系统剖析BlueZ的三阶段编译机制:1)配置阶段生成Makefile;2)编译阶段在.libs目录下产生临时库和可执行文件(不可直接运行);3)安装阶段将产物部署到系统标准路径。重点解析守护进程、命令行工具、动态库的核心路径差异,并针对五大高频问题(如临时库运行崩溃、动态库不匹配、系统覆盖等)给出解决方案。

byte轻骑兵的技术小窝 1万+

2.1 使用pytorch构建一个神经网络

定义一个拥有可学习参数的神经网络。2,pytorch推荐使用方法。处理输入数据使其流经神经网络。将网络参数的梯度进行反向传播。以一定的规则更新网络的权重。构建神经网络的典型流程。

weixin_46779338的博客 332

【LDPC-7】LLR量化位宽对LDPC译码性能的影响分析——以最小和译码算法为例进行matlab仿真

最小和译码算法的步骤如下:最后译码结果如果满足或者完成所有迭代次数,则译码算法停止迭代,否则继续进行译码迭代操作。

FPGA/MATLAB学习教程/源码/项目合作开发 1472

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习基础——通过PyTorch构建神经网络实现1维/2维序列分类

PyTorch学习笔记

Fine的优快云博客 2203

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度学习从0到1:PyTorch 2.5 镜像带你轻松入门神经网络构建与训练

本文介绍了如何在星图GPU平台上自动化部署PyTorch 2.5镜像,快速搭建深度学习开发环境。该镜像预装了PyTorch 2.5和CUDA工具包,支持GPU加速计算,特别适合初学者快速入门神经网络构建与训练,如计算机视觉和自然语言处理等AI应用场景。

weixin_42113456的博客 187

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络

PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络

java1234的博客 491

PyTorch-CUDA-v2.6镜像中安装PyTorch Geometric图神经网络库

基于PyTorch-CUDA-v2.6镜像快速部署PyTorch Geometric,实现图神经网络的高效开发与复现。通过预集成环境避免版本冲突,结合CUDA加速和容器化优势,简化从科研到生产的GNN工作流。

weixin_42513209的博客 414

PyTorch、TensorFlow和Jax构建神经网络模型的标准化流程

构建一个神经网络模型的基本流程

昊大侠的博客 1759

Pytorch搭建神经网络入门

简介 Pytorch作为当前最受欢迎的深度学习框架之一,是笔者十分推荐大家学习和使用的。以下代码,我使用Pytorch提供的线性函数简单搭建了一个神经网络,用以实现对一次函数y = 2*x + 1的拟合,用以帮助大家实现从 0 到 1 搭建神经网络模型。 代码 以下为详细代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np # 搭建神经网络模型 class Model(nn.Modul

Mr_TangGuo的博客 564

Pytorch构建模型的3种方法

这个地方一直是我思考的地方!因为学的代码太多了,构建的模型各有不同,这里记录一下! 可以使用以下3种方式构建模型: 1,继承nn.Module基类构建自定义模型。 2,使用nn.Sequential按层顺序构建模型。 3,继承nn.Module基类构建模型并辅助应用模型容器进行封装(nn.Sequential,nn.ModuleList,nn.ModuleDict)。 其中 第1种方式最为常见,第2种方式最简单,第3种方式最为灵活也较为复杂。 推荐使用第1种方式构建模型。 头文件: import torch

瞳瞳瞳呀 2810

PyTorch实战:L1和L2正则化在神经网络中的效果对比(附代码示例)

本文通过PyTorch实战,详细对比了L1和L2正则化在神经网络中的效果。通过MNIST分类案例,直观展示了L1正则化如何实现特征选择并产生稀疏权重,而L2正则化则均匀压缩权重以提升泛化能力。文章还提供了权重可视化分析、正则化强度调优指南,并探讨了Elastic Net与Dropout等进阶策略,帮助开发者有效应对过拟合问题。

weixin_29159711的博客 239

pytorch: nn.Sequential(func1,func2,func3)

function = nn.Sequential(func1,func2,func3) 生成的是一个列表,可分别通过function[0], function[1], function[2]来获取func1,func2,func3  

wzg2016的博客 575

利用pytorch搭建你的神经网络

利用pytorch搭建你的神经网络 1、理解pytorch中Numpy、Tensor与Variable Numpy是一个数学库,主要用于数组的计算。而我们使用Numpy也是可以手动去编写神经网络进行反向传播深度学习的,但是有两个问题,一是利用Numpy手动去编写神经网络很繁琐,代码量较大,不利于大规模开发;二是Numpy是利用CPU运算,而无法直接使用GPU加速计算。 Tensor,中文名叫张量,如果一个物理量,在物体的某个位置上只是一个单值,那么就是普通的标量,比如密度。如果它在同一个位置、从不同的

qq_42947110的博客 2058

pytorch构建卷积神经网络流程

卷积网络中的输入和输出层与传统神经网络有些区别,需重新设计,训练模块基本一致 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets,transforms import matplotlib.pyplot as plt import numpy as np %matplotlib inline 首先读取.

weixin_43694742的博客 997
上一篇: 【PyTorch】1.2 PyTorch中的autograd
下一篇: 【Pytorch】下载CIFAR10数据集报错:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certi
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值