numpy【极简】RNN

循环神经网络(RNN)的原理与实现 循环神经网络(RNN)的原理与实现 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和深度学习的发展历程中,循环神经网络(Recurrent Neural Network, RNN)是一类非常重要的神经网络模型。与传统的前馈神经网络不同,RNN能够处理序列数据,在自然语 阅读详情

序言

原文出处:http://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/
示例为RNN实现二进制加法,用来帮助理解RNN
可以先看原文(RNN原理和源代码),再看本文
源代码比较冗余,下面是精简后的代码

极简代码

import numpy as np

"""创建训练数据"""
bin_d = 8  # 二进制最大位数
max_num = pow(2, bin_d)  # 十进制最大值
binary = np.unpackbits(np.array([range(max_num)], dtype=np.uint8).T, axis=1)
int2bin = {i: binary[i] for i in range(max_num)}  # 用于整数映射到其二进制

"""sigmoid及其导数【S'(x) = S(x) * (1 - S(x))】"""
sigmoid = lambda x, deriv=False: x * (1 - x) if deriv else 1 / (1 + np.exp(-x))

"""设定超参数和网络架构"""
alpha = 0.1  # 学习速率
hidden_d = 10  # 隐层的神经元个数
input_d = 2  # 2个数相加
output_d = 1  # 2个数相加输出是1个数
# 初始化神经网络权重系数
W0 = 2 * np.random.random((input_d, hidden_d)) - 1
W1 = 2 * np.random.random((hidden_d, output_d)) - 1
Wh = 2 * np.random.random((hidden_d, hidden_d)) - 1

"""训练"""
for j in range(19999):
    # 生成一组样本(a + b = c)
    a_int = np.random.randint(max_num / 2)
    b_int = np.random.randint(max_num / 2)
    c_int = a_int + b_int
    a = int2bin[a_int]
    b = int2bin[b_int]
    c = int2bin[c_int]

    """前向传播"""
    # 存储每个节点的Δ输出层
    y_deltas = []
    # 存储每个节点的隐层(进位用)
    h_list = [np.zeros((output_d, hidden_d))]  # 起初进位是0
    for i in range(bin_d):
        # 从右到左遍历每个二进制位
        X = np.array([[a[bin_d - i - 1], b[bin_d - i - 1]]])
        y = np.array([[c[bin_d - i - 1]]])
        # 隐层 = S(输入层 x W0 + 前一隐层)
        h = sigmoid(X.dot(W0) + h_list[-1].dot(Wh))
        # 输出层 = S(隐层 x W1)
        o = sigmoid(h.dot(W1))
        # Δ输出层 = (y - 输出层) * S'(输出层)
        y_deltas.append((y - o) * sigmoid(o, deriv=True))
        # 记录隐层,用于下个节点(进位)
        h_list.append(h)

    """反向传播"""
    # 初始化Δ隐层
    h_delta = np.zeros(hidden_d)
    for i in range(bin_d):
        # 从左到右遍历每个二进制位
        X = np.array([[a[i], b[i]]])  # 输入层
        h = h_list[-i - 1]  # 当前隐层
        prev_h = h_list[-i - 2]  # 前一隐层
        y_delta = y_deltas[-i - 1]  # 当前Δ输出层
        # Δ隐层 = (Δ隐层 x Wh.T + Δ输出层 x W1.T) * S'(当前隐层)
        h_delta = (h_delta.dot(Wh.T) + y_delta.dot(W1.T)) * sigmoid(h, deriv=True)
        # 更新权重系数
        Wh += prev_h.T.dot(h_delta) * alpha  # += 前一隐层.T x Δ隐层
        W1 += h.T.dot(y_delta) * alpha  # += 隐层.T x Δ输出层
        W0 += X.T.dot(h_delta) * alpha  # += 输出层.T x Δ隐层

"""--------------------模型评估--------------------"""
a_int = np.random.randint(max_num / 2)
b_int = np.random.randint(max_num / 2)
c_int = a_int + b_int
a = int2bin[a_int]
b = int2bin[b_int]
c = int2bin[c_int]
h_list = [np.zeros(hidden_d)]
c_ = np.zeros_like(c)  # 初始化预测值
loss = 0  # 初始化损失值
for i in range(bin_d):
    X = np.array([[a[bin_d - i - 1], b[bin_d - i - 1]]])
    y = np.array([[c[bin_d - i - 1]]])
    h = sigmoid(X.dot(W0) + h_list[-1].dot(Wh))
    o = sigmoid(h.dot(W1))
    h_list.append(h)
    loss += np.abs((y - o)[0])[0]  # 累计损失值
    c_[bin_d - i - 1] = np.round(o[0][0])  # 记录每个预测的二进制位
print('Loss:', loss)
print('Pred:', c_)
print('True:', c)
out = sum(c_[len(c_) - 1 - i] * pow(2, i) for i in range(len(c_)))
print(a_int, '+', b_int, '=', out)
  • 注释
变量名全称解析
wweight coefficient权重系数
hhidden layer隐层
ooutput layer输出层
ddensionality维度
binbinary二进制的
delta第4个希腊字母,大写为Δ,小写为δ在数学中Δ表示变化量

和普通神经网络的差异

在这里插入图片描述

训练过程打印

import numpy as np
np.random.seed(0)  # 设定随机环境

"""创建训练数据"""
bin_d = 8  # 二进制最大位数
max_num = pow(2, bin_d)  # 十进制最大值
binary = np.unpackbits(np.array([range(max_num)], dtype=np.uint8).T, axis=1)
int2bin = {i: binary[i] for i in range(max_num)}  # 用于整数映射到其二进制

"""sigmoid及其导数【S'(x) = S(x) * (1 - S(x))】"""
sigmoid = lambda x, deriv=False: x * (1 - x) if deriv else 1 / (1 + np.exp(-x))

"""设定超参数和网络架构"""
alpha = 0.1  # 学习速率
hidden_d = 20  # 隐层的神经元个数
input_d = 2  # 2个数相加
output_d = 1  # 2个数相加输出是1个数
# 初始化神经网络权重系数
W0 = 2 * np.random.random((input_d, hidden_d)) - 1
W1 = 2 * np.random.random((hidden_d, output_d)) - 1
Wh = 2 * np.random.random((hidden_d, hidden_d)) - 1

"""训练"""
for j in range(10001):
    # 生成一组样本(a + b = c)
    a_int = np.random.randint(max_num / 2)
    b_int = np.random.randint(max_num / 2)
    c_int = a_int + b_int
    a = int2bin[a_int]
    b = int2bin[b_int]
    c = int2bin[c_int]
    c_ = np.zeros_like(c)  # 初始化预测值
    loss = 0  # 初始化损失值

    """前向传播"""
    # 存储每个节点的Δ输出层
    y_deltas = []
    # 存储每个节点的隐层(进位用)
    h_list = [np.zeros((output_d, hidden_d))]  # 起初进位是0
    for i in range(bin_d):
        # 从右到左遍历每个二进制位
        X = np.array([[a[bin_d - i - 1], b[bin_d - i - 1]]])
        y = np.array([[c[bin_d - i - 1]]])
        # 隐层 = S(输入层 x W0 + 前一隐层)
        h = sigmoid(X.dot(W0) + h_list[-1].dot(Wh))
        # 输出层 = S(隐层 x W1)
        o = sigmoid(h.dot(W1))
        # Δ输出层 = (y - 输出层) * S'(输出层)
        y_deltas.append((y - o) * sigmoid(o, deriv=True))
        # 记录隐层,用于下个节点(进位)
        h_list.append(h)
        # 累计损失值
        loss += np.abs((y - o)[0])[0]
        # 记录每个预测的二进制位
        c_[bin_d - i - 1] = np.round(o[0][0])

    """反向传播"""
    # 初始化Δ隐层
    h_delta = np.zeros(hidden_d)
    for i in range(bin_d):
        # 从左到右遍历每个二进制位
        X = np.array([[a[i], b[i]]])  # 输入层
        h = h_list[-i - 1]  # 当前隐层
        prev_h = h_list[-i - 2]  # 前一隐层
        y_delta = y_deltas[-i - 1]  # 当前Δ输出层
        # Δ隐层 = (Δ隐层 x Wh.T + Δ输出层 x W1.T) * S'(当前隐层)
        h_delta = (h_delta.dot(Wh.T) + y_delta.dot(W1.T)) * sigmoid(h, deriv=True)
        # 更新权重系数
        Wh += prev_h.T.dot(h_delta) * alpha  # += 前一隐层.T x Δ隐层
        W1 += h.T.dot(y_delta) * alpha  # += 隐层.T x Δ输出层
        W0 += X.T.dot(h_delta) * alpha  # += 输出层.T x Δ隐层

    """训练过程打印"""
    if j % 1000 == 0:
        print(str(j).center(30, '-'))
        print('Loss:', loss)
        print('Pred:', c_)
        print('True:', c)
        out = sum(c_[len(c_) - 1 - i] * pow(2, i) for i in range(len(c_)))
        print(a_int, '+', b_int, '=', out)

--------------0---------------
Loss: 2.36860806313814
Pred: [0 0 0 0 0 0 0 0]
True: [1 0 1 0 0 0 0 0]
46 + 114 = 0
-------------1000-------------
Loss: 3.8972460327798943
Pred: [0 1 0 1 1 1 1 0]
True: [0 1 1 1 1 1 0 0]
79 + 45 = 94
-------------2000-------------
Loss: 3.7988105355472275
Pred: [0 0 0 0 0 0 0 0]
True: [0 1 0 1 1 0 1 0]
58 + 32 = 0
-------------3000-------------
Loss: 3.591718740829392
Pred: [0 0 0 0 0 0 0 0]
True: [0 1 0 0 1 1 1 0]
45 + 33 = 0
-------------4000-------------
Loss: 2.305327768757372
Pred: [1 0 0 1 1 0 0 0]
True: [1 0 0 1 1 0 0 0]
59 + 93 = 152
-------------5000-------------
Loss: 1.0177087227688317
Pred: [1 0 1 1 1 1 0 0]
True: [1 0 1 1 1 1 0 0]
73 + 115 = 188
-------------6000-------------
Loss: 0.6103001823550381
Pred: [1 0 0 0 0 1 1 0]
True: [1 0 0 0 0 1 1 0]
106 + 28 = 134
-------------7000-------------
Loss: 0.5356951286930459
Pred: [0 1 0 0 1 0 1 1]
True: [0 1 0 0 1 0 1 1]
30 + 45 = 75
-------------8000-------------
Loss: 0.2838521529557654
Pred: [0 1 1 0 1 1 1 0]
True: [0 1 1 0 1 1 1 0]
14 + 96 = 110
-------------9000-------------
Loss: 0.4182943229544548
Pred: [1 0 1 0 0 0 1 0]
True: [1 0 1 0 0 0 1 0]
85 + 77 = 162
------------10000-------------
Loss: 0.33523165770826124
Pred: [1 0 1 0 0 0 1 1]
True: [1 0 1 0 0 0 1 1]
120 + 43 = 163

【Python】 循环神经网络(RNN)算法详解 一个标准的前馈网络,其信息流是单向的、无循环的——从输入层,流经一个或多个隐藏层,最终到达输出层。在任何一个时刻,网络对一个输入样本的处理,与其他任何样本的处理都是完全独立的(Independent)。它对当前输入的“凝视”,是毫无记忆的。原创性隐喻:“失忆的先知(The Amnesiac Oracle)”一个前馈网络,就像一位拥有强大计算能力,但却患有严重短期记忆丧失症的“失忆先知”。对于序列数据而言,这种“失忆症”是致命的。因为序列数据的核心价值,恰恰在于其上下文(Context)——即当前元素与其前后 阅读详情

相关推荐

手写RNN(递归神经网络)

根据http://nooverfit.com/wp/%E6%AF%8F%E4%B8%AA%E4%BA%BA%E9%83%BD%E8%83%BD%E5%BE%92%E6%89%8B%E5%86%99%E4%B8%80%E4%B8%AAlstm-rnn%E9%80%92%E5%BD%92%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C-%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0/#more-860

基于Numpy构建RNN模块并进行实例应用(附代码)

本文详细说明RNN的原理及架构,不依赖任何集成好的深度学习库,仅基于Numpy构建RNN模型,并通过实例学习并理解RNN。

使者大牙ℂypher的博客 2989

vue3的面试题

vue3的面试题

jiang7701037的博客 6271

numpy手写NLP模型(四)———— RNN

numpy手写NLP模型(四)———— RNN1. 模型介绍2. 模型2.1 模型的输入2.2 模型的层次softmax2.3 模型的反向传播3. 模型的代码实现4. 总结 1. 模型介绍 首先介绍一下RNN,RNN全程为循环神经网络,主要用来解决一些序列化具有顺序的输入的问题。普通的前馈神经网络的输入单一决定输出,输出只由输入决定,比如一个单调函数的拟合,一个x决定一个y,前馈神经网络可以直接拟...

qq_30650047的博客 740

移动端抓包实战指南:从HTTPS解密到QUIC协议与证书绑定破解

HTTPS作为保障网络通信安全的核心协议,其工作原理基于TLS/SSL加密与证书信任链验证。在移动应用开发与测试中,抓包是调试接口、分析性能、排查问题的关键技术手段。然而,随着移动端安全性的提升,传统的代理抓包方法常因证书绑定、HTTP/3/QUIC协议等挑战而失效。这要求开发者掌握分层诊断思维,协同使用代理工具、协议分析工具及底层流量捕获工具。例如,面对证书绑定导致的流量不可见,需借助Wireshark进行协议层分析;针对基于UDP的QUIC协议,则需使用支持该协议的抓包工具或临时禁用特性。本文聚焦移动端

weixin_27722377的博客 299

Altera Quartus II FPGA固件烧录全攻略:从SOF到JIC的完整流程(附EPCQ128配置技巧)

本文详细介绍了使用Altera Quartus II工具链将FPGA固件从SOF文件转换为JIC文件并烧录到EPCQ128 Flash芯片的完整流程。内容涵盖环境配置、文件转换步骤、EPCQ128专用配置技巧以及常见问题解决方案,帮助工程师实现FPGA固件的flash固化,确保设计可靠运行。

weixin_30275415的博客 207

如何从NumPy直接创建RNN?

使用成熟的Tensorflow、PyTorch框架去实现递归神经网络(RNN),已经极大降低了技术的使用门槛。但是,对于初学者,这还是远远不够的。知其然,更需知其所以然。要避免低级错误,打好理论基础,然后使用RNN去解决更多实际的问题的话。那么,有一个有趣的问题可以思考一下:不使用Tensorflow等框架,只有Numpy的话,你该如何构建RNN?没有头绪也不用担心。这里便有一项教程:使用Numpy从头构建用于NLP领域的RNN。可以带你行进一遍RNN的构建流程。

2401_83384536的博客 969

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1181

1.RNN-- 使用numpy构建RNN单元

使用numpy构建RNN单元0. 使用numpy构建一个简单的RNN1.什么是RNN2.构建一个RNN2.1 RNN call2.2 RNN 前向传播3. LSTM3.1 什么是LSTM3.2 遗忘门3.3 更新门3.4 输出门3.5 LSTM cell3.6 LSTM 的前向传播 0. 使用numpy构建一个简单的RNN 1.什么是RNN 2.构建一个RNN 2.1 RNN call 2.2 R...

xf1234的博客 1885

HFSS初学笔记(二)——75Ω带状线设计

本文利用HFSS软件设计并优化了一条75Ω的带状线结构,通过调整几何参数和介质材料,实现了精确的阻抗控制。仿真结果显示,该带状线在高频信号传输中的表现优越,具有良好的S参数、低插入损耗和极小的信号反射损耗。

2401_87464239的博客 4550

MAC(m1)-VMWare Fusion安装CentOS7.9

MAC(m1)-VMWare Fusion安装CentOS7.9

兴趣是最好的老师 1771

TensorFlow - 循环神经网络(RNN)(NumPy实现)

TensorFlow - 循环神经网络(RNN)(NumPy实现) flyfish recurrent neural network (RNN) import numpy as np #定义参数 X = [1,2] state = [0.0, 0.0] #隐藏状态被初始化为零向量 #分开定义不同输入部分的权重 w_cell_state = np.asarray([[0.1, 0.2],...

二分掌柜的 1433

SAP 采购订单入库——移动类型

业务场景:采购入库,实物入库至仓库,然后系统同步过账。MIGO:收货、采购订单。 MVT:101 入库,---库存增加。 MVT:移动类型,就是代表业务场景,(比如入库、发货,成本中心发、工单发、报废、盘赢、盘亏等等) 移动类型 1、正向采购入库:101 2、反向冲销(MIGO)102:与101相反,用于错误操作的反向冲销。参考原凭证,全部进行一...

willieyuan的博客 7782

零基础入门:在快马平台生成可运行的rnn逐行解析代码

同时,还需要初始化输出层的权重和偏置。最核心的第五步是循环计算,对于每一个时间步,我们都要做三件事:计算当前时间步的新隐藏状态(这是RNN的核心公式,将当前输入和上一时刻隐藏状态结合起来)、计算当前时间步的输出(通常是对隐藏状态做一个线性变换)、将计算出的新隐藏状态赋值给下一时间步要用的“旧”隐藏状态。第二是梯度流动的理解,虽然我们这个演示只做了前向传播,但可以思考:如果要计算损失对第一个时间步参数的梯度,这个梯度需要沿着时间步反向传播,路径会很长,这就是所谓的“梯度消失”或“梯度爆炸”问题的根源。

GreyWolf12的博客 28

YOLO26跨时代升级!YOLO26 MLCA注意力机制解读

摘要: 本文提出了一种基于多级上下文聚合(MLCA)注意力机制的改进卷积神经网络。MLCA模块通过局部和全局注意力机制动态调整特征图权重,结合了ECA注意力与自适应池化,显著提升特征表达能力。实验表明,添加MLCA后模型mAP提升12.11,准确率提高5.43。文中详细解析了MLCA1模块的工作原理,包括局部/全局池化、卷积操作和注意力加权机制,并介绍了集成MLCA的Bottleneck_MLCA模块。该机制通过多层次特征融合,在保持计算效率的同时增强模型对关键特征的敏感性。最后提供了YOLOv26-MLC

m0_71589036的博客 283

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从零手写SimpleRNN循环神经网络(附完整代码+详细注释+逐行原理解析)

循环神经网络(RNN)是处理时序序列数据的经典基础模型,广泛应用于文本生成、序列预测、语音识别、时间序列预测等任务。相比于CNN专注于空间特征提取,RNN通过隐藏状态传递历史信息,具备记忆时序信息的能力。市面上多数RNN教程基于PyTorch/TensorFlow框架封装好的接口,新手很难理解RNN核心的前向传播、反向传播(BPTT)原理。本文将纯NumPy手写极简SimpleRNN。

m0_64476639的博客 333

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度解析QuickDraw数据集:5000万手绘草图的AI训练革命

在人工智能的视觉识别领域,数据集的质量和特性往往决定了模型的边界。当传统图像数据集局限于像素矩阵时,一个来自Google的创意项目正在重新定义AI理解世界的方式。QuickDraw数据集,这个包含5000万幅手绘草图的庞大资源库,不仅记录了345个日常物品的绘制轨迹,更捕捉了人类绘画行为的本质——从第一笔到最后一笔的完整创作过程。 ## 🔍 重新定义视觉数据:从静态图像到时序轨迹 传统图像数

gitblog_00758的博客 608

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【深度学习】rnn是什么?循环神经网络是什么?RNN前向传播。

但是这t个神经网络不是割裂的,他们使用的参数是相同的也是共享的,既权重共享。这样,在每一个时刻,循环神经网络执行的是相同的计算过程。本文介绍了rnn数据的输入结构以及rnn 用于时间序列的基本单元,并且通过一个numpy的前向传播算法实现了网络的计算。时刻的输入特征向量,这里的t时刻,并不一定真的指的是时间,只是用来表明这是一个序列输入。某一个具体的隐藏层中的神经网络的神经元的输入不仅仅包含上一层的输出,还包括当前层上一个神经元的输出。此时输入的矩阵为一个20个单词的矩阵,每一个单词的维度为5。

高山 782

重温循环神经网络(RNN)

1. 写在前面 最近用深度学习做一些时间序列预测的实验, 用到了一些循环神经网络的知识, 而当初学这块的时候,只是停留在了表面,并没有深入的学习和研究,只知道大致的原理, 并不知道具体的细节,所以导致现在复现一些经典的神经网络会有困难, 所以这次借着这个机会又把RNN, GRU, LSTM以及Attention的一些东西复习了一遍,真的是每一遍学习都会有新的收获,之前学习过也没有整理, 所以这次也借着这个机会把这一块的基础内容进行一个整理和总结, 顺便了解一下这些结构底层的逻辑。 当然,这次的整理是查缺补漏

Miracle8070 2276

Numpy实现RNN

提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

2401_83817769的博客 966

【Pytorch教程】:RNN 循环神经网络 (分类)

Pytorch教程目录 Torch and Numpy 变量 (Variable) 激励函数 关系拟合(回归) 区分类型 (分类) 快速搭建法 批训练 加速神经网络训练 Optimizer优化器 卷积神经网络 CNN 卷积神经网络(RNN、LSTM) RNN 循环神经网络 (分类) 目录Pytorch教程目录MNIST手写数据RNN模型训练 MNIST手写数据 import torch from torch import nn import torchvision.datasets as dsets im

nanke_4869的博客 2877

RNN循环神经网络代码实例

原文中有更详尽的对RNN原理的介绍,形象生动,值得一看。 这个RNN模型的目的是计算两个八位二进制数的和,有进位。

GodxvA 4800

从零开始实现神经网络(三)_RNN循环神经网络

Python 中从头开始(仅使用。

ourkix的博客 1985

循环神经网络教程-第二部分 用python numpy theano实现RNN

这是Github的代码地址在这一部分我们将会用Python从头实现一个完整的RNN,并使用Theano(一个在GPU上执行操作的库)优化我们的实现。 Github上提供了完整的代码。我将跳过一些对于理解循环神经网络不是必要的样板代码,但所有这些代码也都在Github上。语言模型我们的目标是用RNN建立一个语言模型,也就是说现在有一个有m个词的句子,语言模型允许我们预测观察句子(在给定数据集中)的概率

u013713117的专栏 6219

rnn numpy

【转】https://zybuluo.com/hanbingtao/note/541458 【转】karpathy/min-char-rnn.py # @TIME : 2019/7/21 下午02:07 # @File : RNN_numpy.py import numpy as np from functools import reduce class ReluActivato...

sinat_15355869的博客 270
上一篇: numpy【极简】神经网络(非线性)
下一篇: TensorFlow【极简】CNN
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值