cs231n assignment2 Fully-connected Neural Network

[CS231n Assignment 2 #01] 全连接神经网络(Fully-connected Neural Network) 文章目录作业介绍1.Fully-Connected Neural Nets 架构2. 初始化作业环境3. 实现全连接层(Affine Layer)3.1 前向传播3.2 反向传播4. ReLU激活函数5. "Sandwich" layers6. 损失层(Loss Layer)7. 两层神经网络(Two-layer network)8. 优化器(Solver)8.1 Solver剖析8.2 实际训... 阅读详情

开始了卷积神经网络的学习,这部分内容还是非常多的。本次作业分为五个部分:Q1:Fully-connected Neural Network、Q2:Batch Normalization、Q3:Dropout、Q4:Convolutional Networks、Q5:PyTorch / TensorFlow on CIFAR-10。

以下内容为全连接网络内容,采用模块化的设计,思路非常清晰。

准备工作:

Affine layer

foward

完成对x的reshape,并计算出全连接层的结果

layers.py中的affine_forward()

# 此处返回的x同原始纬度,即对x本身不做任何reshape操作
D = w.shape[0]
new_x = x.reshape(-1,D)
out = new_x.dot(w) + b
backward

layers.py中的affine_backward()

db = np.sum(dout,axis=0)                        # (M,)
# 设置纬度
N = dout.shape[0]
new_x = x.reshape(N,-1)                         # (N,D) 其中D = d_1 * d_2 * .. * d_k
dw = new_x.T.dot(dout)                              # (D,M)
dx = dout.dot(w.T).reshape(x.shape)             # (N,d_1,...,d_k)

ReLU activation

forward

ReLU函数为max(0,x),使用numpy中的maximum函数即可实现
layers.py中的relu_forward()

out = np.maximum(0,x)
backward

关于ReLU的反向传播计算方法:x大于0的数乘以上层梯度,其余位置为0,代码如下:

dx = (x > 0) * dout

“Sandwich” layers

这部分代码已经集成好了,主要的工作是把affine层后面接了ReLU层,两个层关联到一起。

Loss layers: Softmax and SVM

已经实现好了Softmax和SVM的损失函数,包括计算loss和梯度。

Two-layer network

实现模块化的两层神经网络。
fc_net.py中的__init__()

W1 = np.random.randn(input_dim,hidden_dim) * weight_scale
b1 = np.zeros((1,hidden_dim))
W2 = np.random.randn(hidden_dim,num_classes) * weight_scale
b2 = np.zeros((1,num_classes))
self.params['W1'] = W1
self.params['b1'] = b1
self.params['W2'] = W2
self.params['b2'] = b2

fc_net.py中的loss()
计算scores

W1 = self.params['W1']
b1 = self.params['b1']
W2 = self.params['W2']
b2 = self.params['b2']

h,cacheh = affine_forward(X,W1,b1)
h1,cacheh1 = relu_forward(h)
out,cache2 = affine_forward(h1,W2,b2)
scores = out

计算loss和梯度

# 计算loss
data_loss,dscores = softmax_loss(scores,y)
reg_loss = 0.5 * self.reg * (np.sum(W1 * W1) + np.sum(W2 * W2))
loss = data_loss + reg_loss

# 反向传播
dh1,dW2,db2 = affine_backward(dscores,cache2)
dh = relu_backward(dh1,cacheh1)
dX,dW1,db1 = affine_backward(dh,cacheh)

grads['W2'] = dW2 + self.reg * W2
grads['b2'] = db2
grads['W1'] = dW1 + self.reg * W1
grads['b1'] = db1

Solver

使用已经给出的solver.py代码的API进行训练。
FullyConnectedNets.ipynb

solver = Solver(model,data,
               update_rule='sgd',
               optim_config={
                   'learning_rate':4e-4
               },
               lr_decay=0.95,
               num_epochs=10, batch_size=100,
               print_every=100)

solver.train()

准确率可以达到50%了。

Multilayer network

接下来需要完成fc_net.py中的FullyConnectedNet类,但是在多层网络中需要实现batch normalization、layer normalization、dropout等相关函数,这些函数暂时先不实现,在后面的练习中实现。

在前向网络中,按照要求实现L-1层的循环,包括affine -> normalization -> ReLU -> dropout,最后在实现一层affine即可。
loss()函数

# affine -> batch -> relu -> dropout 循环L-1 ->affine ->softmax

caches = list()
for i in range(self.num_layers - 1):
	cache = list()
	scores, fc_cache = affine_forward(scores, self.params['W' + str(i + 1)],self.params['b' + str(i + 1)])
	cache.append(fc_cache)
	if self.normalization is not None:
		if self.normalization == 'batchnorm':
			scores, bn_cache = batchnorm_forward(scores, self.params['gamma' + str(i + 1)],self.params['beta' + str(i + 1)], bn_param[i])
			cache.append(bn_cache)
		elif self.normalization == 'layernorm':
			scores, ln_cache = layernorm_forward(scores, self.params['gamma' + str(i + 1)],self.params['beta' + str(i + 1)], bn_param[i])
			cache.append(ln_cache)
		pass
	scores, relu_cache = relu_forward(scores)
	cache.append(relu_cache)

	if self.use_dropout:
		scores, droupout_cache = dropout_forward(scores, self.dropout_param)
		cache.append(droupout_cache)
	caches.append(cache)
	pass
scores, fc_cache = affine_forward(scores, self.params['W' + str(self.num_layers)],self.params['b' + str(self.num_layers)])
caches.append(fc_cache)

反向传播,loss和gradient计算:

loss, dx = softmax_loss(scores, y)

# 加上正则项
for i in range(self.num_layers):
	loss += 0.5 * self.reg * np.sum(self.params['W' + str(i + 1)] ** 2)
pass

# 计算梯度
for i in range(self.num_layers, 0, -1):
	if i == self.num_layers:
		# 计算最后一层梯度
		dx, dw, db = affine_backward(dx, caches[i - 1])
		# 保存梯度并加上正则项
		grads['W%s' % i] = dw + self.reg * self.params['W' + str(i)]
		grads['b%s' % i] = db
		pass
	else:
		j = -1
		if self.use_dropout:
			dx = dropout_backward(dx, caches[i - 1][j])
			j -= 1
			pass

		dx = relu_backward(dx, caches[i - 1][j])
		j -= 1
		if self.normalization is not None:
			if self.normalization == 'batchnorm':
				dx, dgamma, dbeta = batchnorm_backward(dx, caches[i - 1][j])
				j -= 1
			elif self.normalization == 'layernorm':
				dx, dgamma, dbeta = layernorm_backward(dx, caches[i - 1][j])
				j -= 1
			else:
				raise ValueError("No such normalization")
			# 保存梯度
			grads['gamma%s' % i] = dgamma
			grads['beta%s' % i] = dbeta
			pass

		dx, dw, db = affine_backward(dx, caches[i - 1][j])
		# 保存梯度并加上正则项
		grads['W%s' % i] = dw + self.reg * self.params['W' +str(i)]
		grads['b%s' % i] = db

接着需要设置相应的learning_rate 和 weight_scale使模型对小部分数据达到过拟合,使训练准确率达到100%,根据损失函数走势逐步增大。

三层网络对应的参数选择:

weight_scale = 1e-2   # Experiment with this!
learning_rate = 1.5e-2  # Experiment with this!

五层网络对应的参数选择:

learning_rate = 2e-3  # Experiment with this!
weight_scale = 1e-1   # Experiment with this!

Update rules

以上所有的更新规则都是用了随机梯度下降SGD算法,对于SGD算法拥有着一个缺点:在高维数据的情况下,梯度会卡在鞍点上。所谓鞍点,既非极小值点,又非极大值点。

SGD+Momentum

optim.py中的sgd_momentum()函数

v = config['momentum'] * v - config['learning_rate'] * dw
next_w = w + v
RMSProp and Adam

RMSProp()

grad_squared = config['decay_rate'] * config['cache'] + (1-config['decay_rate']) * dw * dw
next_w = w - config['learning_rate'] * dw / (np.sqrt(grad_squared) + config['epsilon'])
config['cache'] = grad_squared

Adam()

# 迭代次数 + 1
t = config['t'] + 1

beta1 = config['beta1']
beta2 = config['beta2']
m = config['m']
v = config['v']
# fisrt moment
m = beta1 * m + (1 - beta1) * dw
# second moment
v = beta2 * v + (1 - beta2) * dw * dw

first_unbias = m / (1 - beta1 ** t)
second_unbias = v / (1 - beta2 ** t)
next_w = w - config['learning_rate'] * first_unbias / (np.sqrt(second_unbias) + config['epsilon'])

# 更新first moment、second moment和迭代次数
config['m'] = m
config['v'] = v
config['t'] = t

Inline Question

Inline Question 1

We’ve only asked you to implement ReLU, but there are a number of different activation functions that one could use in neural networks, each with its pros and cons. In particular, an issue commonly seen with activation functions is getting zero (or close to zero) gradient flow during backpropagation. Which of the following activation functions have this problem? If you consider these functions in the one dimensional case, what types of input would lead to this behaviour?

  1. Sigmoid
  2. ReLU
  3. Leaky ReLU

Answer
1和2会造成梯度消失,因为这两者函数存在某一段区间上,函数导数为0。

Inline Question 2
Did you notice anything about the comparative difficulty of training the three-layer net vs training the five layer net? In particular, based on your experience, which network seemed more sensitive to the initialization scale? Why do you think that is the case?

Answer
三层网络同五层网络都可以实现过拟合小数据集,但是三层网络此时对验证集的泛化能力更好。五层网络对参数初始化更加敏感,因为五层网络层次多、参数多,loss函数更加复杂,更容易陷入局部最小值。

Inline Question 3

AdaGrad, like Adam, is a per-parameter optimization method that uses the following update rule:

cache += dw**2
w += - learning_rate * dw / (np.sqrt(cache) + eps)

John notices that when he was training a network with AdaGrad that the updates became very small, and that his network was learning slowly. Using your knowledge of the AdaGrad update rule, why do you think the updates would become very small? Would Adam have the same issue?

Answer
AdaGrad:cache因为加上dw的平方项后会变得越来越大,导致分母增加,故导致w每次增量减小。对于凸函数来讲,会在全局最小值处越来越慢,固然很好。但是对于非凸函数,这样的会困在局部最小值处。
对于Adam算法则不会,因为更新之前使用的规则是 m = m 1 − b e t a 1 ∗ ∗ t m = \frac{m}{1-beta1**t} m=1−beta1∗∗tm​和 v = v 1 − b e t a 2 ∗ ∗ t v = \frac{v}{1-beta_2**t} v=1−beta2​∗∗tv​。可以看到随着t的增加,使得m和v都在减小,但是更新规则中,分母为根号v,则分母缩小的速度更快,故更新速度不会变慢。

训练好的模型

完成FullyConnectedNets.ipynb,其中Dropout和BatchNormalization留到后面作业完成,若此时完成,准确率能提升十个百分点。

代码:

model = FullyConnectedNet([100, 100, 100, 100, 100], weight_scale=5e-2)

solver = Solver(model, small_data,
                num_epochs=10, batch_size=100,
                update_rule='adam',
                optim_config={
                'learning_rate': 1.2e-3
                },
                verbose=True)
solver.train()

plt.subplot(3, 1, 1)
plt.title('Training loss')
plt.xlabel('Iteration')

plt.subplot(3, 1, 2)
plt.title('Training accuracy')
plt.xlabel('Epoch')

plt.subplot(3, 1, 3)
plt.title('Validation accuracy')
plt.xlabel('Epoch')

plt.subplot(3, 1, 1)
plt.plot(solver.loss_history, 'o', label=update_rule)
  
plt.subplot(3, 1, 2)
plt.plot(solver.train_acc_history, '-o', label=update_rule)

plt.subplot(3, 1, 3)
plt.plot(solver.val_acc_history, '-o', label=update_rule)
plt.gcf().set_size_inches(15, 15)
plt.show()

best_model = model

参考文章
https://www.jianshu.com/p/9c4396653324
https://blog.youkuaiyun.com/weixin_39880579/article/details/86764215

全连接神经网络(DNN) 最近想要学习深度学习模型,没有一上来就先学习CNN、RNN、LSTM,而是先学习全连接神经网络(Fully Connected Neural Network),原因非常简单,上述所说的各种神经网络都是基于全连接神经网络出发的,最基础的原理都是由反向传播而来,所以只要掌握了这节最基本的原理,接下来的各种网络也能学得得心应手。 一、全连接神经网络简介 全连接神经网络模型是一种多层感知机(MLP),感知机的原理是寻找类别间最合理、最具有鲁棒性的超平面,最具代表的感知机是SVM支持向量机算法。神经网络同时借鉴了感知 阅读详情

相关推荐

CS231n Assignment2--Fully-connected Neural Network

课程网址:http://cs231n.github.io/assignments2016/assignment2/ 主要目的是保存一下一个比较完整的全连接神经网络代码,不带说明了,代码说明也比较详细。 dataset.py # -*- coding: utf-8 -*- import numpy as np def unpickle(file): import c

ForLearning 2807

[CS231n@Stanford] Assignment2-Q1 (python) Fully-connected Neural Network实现

layer.py import numpy as np def affine_forward(x, w, b): """ Computes the forward pass for an affine (fully-connected) layer. The input x has shape (N, d_1, ..., d_k) and contains a minibatc

youknowzjz的博客 5152

CS231n笔记2--Fully Connected Neural Network与Activation Function

Fully Connected Neural Network与Activation Function神经网络–Fully Connect Neural Network一个最简单的神经网络 hw,b=f(x1w1+x2w2+x3w3+b)=f(XW+b)h_{w,b}=f(x_1w_1+x_2w_2+x_3w_3+b)=f(XW+b) 向量化的python代码def f(z): retur

u012767526的专栏 7810

深度学习笔记——全连接神经网络样例程序及详细注释

全连接神经网络(fully connected neural network),顾名思义,就是相邻两层之间任意两个节点之间都有连接。全连接神经网络是最为普通的一种模型(比如和CNN相比),由于是全连接,所以会有更多的权重值和连接,因此也意味着占用更多的内存和计算。 本文将分为两部分,第1部分介绍了一个完整的全连接神经网络的样例程序,并对程序中的函数进行了详细的注解。第2部分结合tensorflo...

生命在于折腾! 1万+

深度学习 15. 全连接和区域连接,fully connected 和 local connected, 解释说明(最简单的解释)

深度学习 15. 全连接和区域连接,fully connected 和 local connected, 解释说明(最简单的解释)

不积跬步无以至千里 1万+

测站坐标系统 -- 东北天(ENU)坐标系、站心坐标系

测站坐标系统以观测站(或地面上某一个观测点为中心建立坐标系统,将这类坐标系称为测站坐标系统。测站坐标系通常以用户所在的位置点P为坐标原点三个坐标轴分别是相互垂直的东向北向和天向,因而测站坐标系又称为东北天(ENU)坐标系。由于测站坐标系以站心为坐标原点,因此也称为站心坐标系。如图所示,测站坐标系的天向与大地坐标系(LLA经纬度坐标系)在此点的高程方向一致。测站坐标系固定在地球上,本质上是一种地固坐标系。(1)以站心为坐标原点。(2)Z轴与站心点的椭球法线重合,向上为正。

qq_43381998的博客 1万+

Fully Connected Neural Network

CS231n 计算机视觉 Assignment1 2022 two-layer neural network代码

elfighting的博客 490

Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)

简介:本文介绍了Android开发中常用的键值对存储方案,包括SharedPreferences、MMKV和DataStore,并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。

LiuYong_01的博客 1779

CS231n-assignment2-Fully-connected Neural Network

全神经网络 在前面的作业中,您在CIFAR-10上实现了一个完全连接的两层神经网络。实现是简单的,但不是非常模块化,因为损耗和梯度计算在一个单一的单片函数。对于一个简单的两层网络来说,这是可以管理的,但是当我们转向更大的模型时,这将变得不切实际。理想情况下,我们希望使用更模块化的设计来构建网络,这样我们就可以孤立地实现不同的层类型,然后将它们组合到具有不同架构的模型中。 在本练习中,我们将使用更模块化的方法实现全连接网络。对于每个层,我们将实现一个前向函数和一个后向函数。forward函数将接收输入、权重和

Esaka 1626

CVPR 2024 LaTeX 模板实战:从匿名提交到图表排版的避坑指南

本文详细解析CVPR 2024 LaTeX模板的使用技巧,涵盖匿名提交设置、pdfLaTeX编译器选择、图表排版优化等关键环节。通过实战案例演示智能引用、公式编号、三线表制作等专业技巧,帮助研究者高效完成论文格式规范,规避常见排版错误。特别针对双栏格式下的图片定位、跨栏表格等复杂场景提供解决方案。

weixin_42561040的博客 453

非球面检测

摘要:非球面镜检测主要采用干涉法,包括零位补偿和非零位补偿两种方式。零位补偿通过透镜组完全校正像差,精度达1%波长,但设计复杂成本高;非零位补偿利用部分像差补偿降低波前斜率,适用于规则非球面。折射-衍射混合补偿镜能同时校正多种像差。实际检测中可采用物理补偿镜或动态CGH加载方案,光路设计需运用坐标断点和多重结构技术实现复杂光路建模。不同方法各具优势,需根据检测需求选择合适方案。

Zhaxibamao的博客 2105

cs231n:assignment2——Q1: Fully-connected Neural Network

视频里 Andrej Karpathy上课的时候说,这次的作业meaty but educational,确实很meaty,作业一般是由.ipynb文件和.py文件组成,这次因为每个.ipynb文件涉及到的.py文件较多,且互相之间有交叉,所以每篇博客只贴出一个.ipynb或者一个.py文件.(因为之前的作业由于是一个.ipynb文件对应一个.py文件,所以就整合到一篇博客里) 还是那句话,有错误

xieyi4650的博客 8415

从零到一:用Verilog和Quartus构建智能交通灯系统的实战指南

本文详细介绍了如何使用Verilog和Quartus Prime从零开始构建智能交通灯系统。通过分步指导,包括状态机设计、时序控制、数码管显示等核心模块实现,并结合ModelSim仿真验证,帮助FPGA初学者掌握数字电路设计的关键技术。文章还提供了实际部署到FPGA开发板的调试技巧和进阶优化方案。

weixin_29172201的博客 473

CS231n assignment2 Q1 Fully-connected Neural Network

有句话叫“懂得了很多道理,依然过不好这一生。”用在这道题里很合适“懂得了每个过程的原理,依然写不好这代码。” 但抄完之后还是颇有收获的。 1、完成放射变换前向传播,f = wx + b def affine_forward(x, w, b): """ Computes the forward pass for an affine (fully-connected) lay...

weixin_30454481的博客 607

机器视觉框架源码——解读5(Dock和开源UI)

本文介绍了工业软件中Dock工具面板的使用方法,主要包括三个部分:添加avalonDock引用、修改属性配置(如显示样式和背景色),以及通过MVVM命令实现布局的加载和保存。加载布局通过XmlLayoutSerializer从XML文件恢复界面状态,保存布局则将当前DockManager的布局序列化为XML文件。文章提供了代码示例和截图说明,帮助开发者快速掌握Dock面板的核心功能。

Z's Palace 401

B站自动答题协议分析

使用Python写了一个自动答题机器人!基于接口协议实现且包含点选验证码识别

吴秋霖的博客 2648

CS231n(Spring 2019)Assignment 1 - Two-Layer Neural Network

(in cs231n/classifiers/neural_net.py) from __future__ import print_function from builtins import range from builtins import object import numpy as np import matplotlib.pyplot as plt from past.builtins import xrange class TwoLayerNet(object): """

嫉妒的虚荣 424

ansys非线性分析中接触类型

不分离(No Separation)‌:法向始终保持接触不分离,切向允许自由滑动,属于线性接触,适合需要法向约束、允许微小切向位移的场景,比如过盈配合的简化模拟。有摩擦(Frictional)‌:法向允许分离,切向根据用户设置的摩擦系数计算摩擦力,是工程中最符合实际机械接触的类型,绝大多数装配体分析都选择该类型。无摩擦(Frictionless)‌:法向允许接触面分离,切向无摩擦、允许自由滑动,适合模拟理想润滑的光滑接触面,图中当前选择的就是该类型。非线性接触(需要多次迭代,属于真正的非线性接触行为)‌。

qq_15963745的博客 71

cs231n 课程作业 Assignment 1

Assignment 1完成 这里 的课程笔记中 Module 1: Neural Networks 的阅读。作业要求见 Assignment #1: Image Classification, kNN, SVM, Softmax, Neural Network,主要需要完成 kNN,SVM,Softmax分类器,还有一个两层的神经网络分类器的实现。Download  The CIFAR-10 d...

gdamichael的博客 308

Statistics and Machine Learning Toolbox

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

CS231n assignment1 Q4 Two-Layer Neural Network

网络设置: 两层的神经网络,第一层激活函数为Relu,第二层用softmax输出分类概率。使用随机梯度下降来训练。 neural_net.py from __future__ import print_function import numpy as np import matplotlib.pyplot as plt class TwoLayerNet(object): """...

weixin_30394633的博客 275

STM32F407中文手册

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

CS231n Assignment1:Two Layers Net

cs231n/classifiers/neural_network.py代码: from __future__ import print_function import numpy as np import matplotlib.pyplot as plt class TwoLayerNet(object): """ A two-layer fully-connected neural...

Najlepszy的博客 503

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

cs231n assignment1 two layer net作业

from __future__ import print_function import numpy as np import matplotlib.pyplot as plt class TwoLayerNet(object): """ A two-layer fully-connected neural network. The net has an input dimensio...

AIpush的博客 960

CS231n-assignment2 FullyConnectedNet 多层神经网络的实现 任意数量隐藏层的实现

  from builtins import range from builtins import object import numpy as np from cs231n.layers import * from cs231n.layer_utils import * class TwoLayerNet(object): """ A two-layer fully...

AI_Beginner 1011

深度学习-神经网络:DNN(Deep Neural Networks=Fully Connected Neural Net==MLP,深度神经网络=全连接神经网络=多层感知器)

人工智能-机器学习-深度学习-神经网络:DNN(Deep Neural Networks=Fully Connected Neural Net==MLP,深度神经网络=全连接神经网络=多层感知器)

u013250861的博客 4452

全连接神经网络详解(Full Connect Neural Network)

全连接神经网络详解(Full Connect Neural Network) 文章目录全连接神经网络详解(Full Connect Neural Network)前言一、单层神经网络1.1 正向传播1.2 损失函数1.3 梯度下降二、浅层神经网络2.1 正向传播2.2 反向传播三、深层神经网络3.1 ImageNet发展史3.2 网络参数总结及展望 前言 深度学习最基础的网络类型的之一,全连接神经网络(Full Connect Neural Network)是大多数入门深度学习领域的初学者必学的内容,充

weixin_40928633的博客 6万+

CS231n Spring 2019 Assignment 2—Fully-Connected Neural Nets(全连接神经网络)

Fully-Connected Neural Nets全连接神经网络Fully-Connected Neural Nets(全连接神经网络)Affine layer: foward/backwardReLU activation: forward/backward"Sandwich" layersTwo-layer networkMultilayer networkUpdate rulesSGD+...

laizi_laizi的博客 2179
上一篇: cs231n assignment1 features
下一篇: cs231n assignment2 Batch Normalization
一叶知秋Autumn
博客等级 码龄10年 170粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值