Tensorflow神经网络,mnist,CPU和GPU同时跑通,一轮96%,20轮99%-- GPU版

用GPU分别采用pytorch和tensorflow跑MNIST(LeNet-5模型)【可初步了解tnesorflow与pytorch转换】 【代码】用GPU分别采用pytorch和tensorflow跑MNIST(LeNet-5模型)【可初步了解tnesorflow与pytorch转换】 阅读详情

GPU版本: 注意都是Tensorflow1.0版本,2.0版本不再用Session了,

import tensorflow as tf
import numpy as np
import os
import time
ISOTIMEFORMAT = '%Y-%m-%d-%H-%M-%S'
localtime = time.strftime(ISOTIMEFORMAT, time.localtime())


from tensorflow.examples.tutorials.mnist import input_data
#import input_data
os.environ['CUDA_VISBLE_DEVICES'] = '0'

# 输入数据 mnist数据集,55000张图片;
mnist=input_data.read_data_sets(r'C:\Users\c00525771\Documents\Python Scripts\CNN\MNIST_data',one_hot=True)#参数一:文件目录。参数二:是否为one_hot向量

# interactiveSession 交互会话
config = tf.ConfigProto(log_device_placement = True) #, allow_soft_placement = True
config.gpu_options.allow_growth = True


#config = tf.ConfigProto(log_device_placement = True, allow_soft_placement = True)
with tf.device('/gpu:0'):
    sess = tf.InteractiveSession(config = config)
    #tf.Session(config = tf.ConfigProto(log_device_placement = True))
    #tf.InteractiveSession()

    """计算图
    为了在Python中进行高效的数值计算,我们通常会使用像NumPy一类的库,将一些诸如矩阵乘法的耗时操作在Python环境的外部来计算,这些计算通常会通过其它语言并用更为高效的代码来实现。
    
    但遗憾的是,每一个操作切换回Python环境时仍需要不小的开销。如果你想在GPU或者分布式环境中计算时,这一开销更加可怖,这一开销主要可能是用来进行数据迁移。
    
    TensorFlow也是在Python外部完成其主要工作,但是进行了改进以避免这种开销。其并没有采用在Python外部独立运行某个耗时操作的方式,而是先让我们描述一个交互操作图,然后完全将其运行在Python外部。这与Theano或Torch的做法类似。
    
    因此Python代码的目的是用来构建这个可以在外部运行的计算图,以及安排计算图的哪一部分应该被运行。详情请查看基本用法中的计算图表一节。
    
    --- 计算图的含义是:矩阵乘法等耗时的操作应该转换到python外用更高效语言(如C)实现,但是切换本身很耗时。所以排列好,整体外置来运算,这是session层层建立的原因;
    不是每一步都到外部,机制上是整个委托外部,内部结算和观察;
    """

    # softmax回归模型建立;
    '建立输入出'
    in_size = 28*28
    out_size = 10
    x = tf.placeholder("float", shape = [None, in_size]) # 784长张量作为输入 input,
    # None易混淆-表示的不是“无”而是不定,相当于 NotSure, Scalable (输入10,1000,10000个784 Tensor都可以接受)
    y_ = tf.placeholder("float", shape = [None, out_size]) #10个种类输出(就是keyhole是10bit) #真实的输出

    '建立中间量'
    W = tf.Variable(tf.zeros([in_size, out_size]))
    b = tf.Variable(tf.zeros([out_size]))

    '初始化'
    sess.run(tf.initialize_all_variables()) #这里all variables为函数,而非一个变量集合,注意;

    '类别预测与loss'
    y = tf.nn.softmax(tf.matmul(x, W)+b) # 关键的预测函数 y = Wx + b  nural network 's softmax functions;
    cross_entropy = -tf.reduce_sum(y_*tf.log(y)) # -Sigma{ y_obs*log(y_pred) };

    '训练模型'
    train_step = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(cross_entropy)
    # 最优化梯度下降算法,-s*delta(fx),s learning_rate + fx-object function (cross_entropy, ls, MMSE), 算法:最速下降、牛顿法
    # #gradentDescentOptimizer 梯度下降优化法,梯度下降优化 需要迭代次数,会有反复性, 更新权值; x = -s*delta(f(x)); xnew;
    # operate train_step to iteratively update train_step
    for i in range(1000):
        batch = mnist.train.next_batch(50)
        train_step.run(feed_dict = {x: batch[0], y_:batch[1]}) #反馈字典: 真实x值batch x: 真实y值y_ batch y_
        # 注意,在计算图中,你可以用feed_dict来替代任何张量,并不仅限于替换占位符。

    '评估模型'
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))  # 判断最大索引值是否相等来看正确,错误;
    # 注意y_是一批数据,每行是同一份输出 none行,out_size列; 沿着axis = 1;
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float")) #转bool类型为 float类型;
    print(accuracy.eval(feed_dict = {x:mnist.test.images, y_: mnist.test.labels}) )


    ""'构建一个多层卷积网络'
    '权重初始化'# b +XW; 故 0.01 mean Value + 0.01*normVariable
    def weight_variable(shape):
        initial = tf.truncated_normal(shape, stddev = 0.1) #截断正态分布,norm(0,stddev = 0.01), 但是大于2*stddec 的值被切掉了,保证平稳性;
        return tf.Variable(initial)
    def bias_variable(shape):
        initial = tf.constant(0.1, shape = shape)
        return tf.Variable(initial)

    '卷积和池化' # 超参数1: 步幅长度,边距是不是1或2, 池化核大小
    #卷积函数和池化函数,步幅度stride都设置为1,0边距,池化核2x2最简版;
    def conv2d(x, W):
        return tf.nn.conv2d(x, W, strides = [1, 1, 1, 1], padding = 'SAME')

    def max_pool_2x2(x):
        return tf.nn.max_pool(x, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1], padding = 'SAME')

    '一层 二层卷积层,密集连接层'  # 超参数2:层数,池化要不要,各卷积核5x5?,深度32?,
    W_conv1 = weight_variable([5, 5, 1, 32]) # 卷积核mxn x 通道数k x 卷积深度 p;
    b_conv1 = bias_variable([32])
    x_image = tf.reshape(x, [-1,28,28,1])

    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)

    # layer2:
    W_conv2 = weight_variable([5, 5, 32, 64]) #64是32的每个输出2个吗?
    b_conv2 = bias_variable([64])

    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    #注意数据流动,流动过程中处理的相应变化;;  (这里池化因为2x2,长宽均缩小一半每次)
    # x-(reshape 28x28)->x_image -> conv1+pool--(5x5x1x32, 2x2x1pool)-->pool1 -(conv2+pool2 5x5x32x64)->

    #whole link 超参数3:全连接的大小
    w_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])

    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)

    'DropOut'
    #减少过拟合,加dropout, placeholder代表神经元输出在dropout中保持不变;
    # 训练中drouout,测试关闭dropOut的; 附带处理scale,缩小放大值使得正好码?
    keep_prob = tf.placeholder("float")
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) #丢弃功率,丢掉h——fc1后的输出(丢的不是超参数,而是输入 训练值)


    '输出层'
    w_fc2 = weight_variable([1024, out_size])
    b_fc2 = bias_variable([out_size])

    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, w_fc2) + b_fc2)

    '训练和评估模型'
    cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
    train_step = tf.train.AdamOptimizer(learning_rate =  1e-4).minimize(cross_entropy)
    correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,'float32'))

    #启动流程和启动循环,每100个输出一次进展,step多少,准确率多少,训练的测试的准确率
    sess.run(tf.initialize_all_variables())
    for i in range(2000): #20
        batch = mnist.train.next_batch(50) # batch 大小一个超参数4
        if i%100 == 0:
            train_accuracy = accuracy.eval(feed_dict = {x : batch[0], y_:batch[1], keep_prob : 1.0})
            print("step %d, training accuracy %g"%(i, train_accuracy))
        train_step.run(feed_dict= {x:batch[0], y_:batch[1], keep_prob: 0.5})

    print("test accuracy%g" % accuracy.eval(feed_dict = {x:mnist.test.images, y_:mnist.test.labels, keep_prob:1}))

在这里插入图片描述

  • A 椭圆形式操作函数:绿色输入、重整函数、标签输入出、交叉熵操作,softmax操作(都是在nn之外)
  • B 白色是nn内操作(循环迭代lay1-layer2,更新参数)
  • C 橙色方框是永久变量 placeholder那个东西; W和偏差b; 黄色方框是迭代公式,迭代W和b的值的(批更新,取
    平均值得更新)
  • D 白色内的椭圆也是操作, 紫色是最耗时的矩阵乘法操作,蓝色是简单加操作, 粉红色是神经元激活函数,

流图输入出,各个变量W,b,还有乘法MatMul什么的都看得懂,但是怎么一混起来就迷糊呢?因为中央关键Gradients你没抓住,NN迭代的关键是最优化之梯度下降(最速下降、牛顿法等等类似思想)。迭代值x_ = -α*df(x) 即需要步长(所谓学习速率)、目标函数(交叉熵、最小均方等)、还有做梯度运算的方法(简单梯度下降还是Adam之类的),做完就去更新权值W,更新偏差b,好进入下一轮迭代。
所以承上启下的Gradients模块,下面大白框运算是前一轮的预测过程,上面是更新W、b好进入下一轮运算(所以此W非彼W了)。W b独自要placeHolder永久设立储存空间意义就在这里,一直迭代轮询下去。-- 隐藏循环在内的。

小结

(总结了好多字,被限制,都丢了。|T~T|)

在MNIST上实现~99%的测试准确率(tensorflow) 一个简单的卷积神经网络,在MNIST上实现~99%的测试准确率。 阅读详情

相关推荐

TensorFlow解决MNIST数字识别问题

TensorFlow解决MNIST数字识别问题 废话 这个MNIST数字识别问题是我实现的第一个神经网络,虽然过程基本上都是对着书上的代码敲,但还是对神经网络的训练过程有了一定的了解,同时也复习了前面几章关于TensorFlow和神经网络的一些基本概念。 MNIST介绍 MNIST是一个非常有名的手写体数字识别数据集,通常用来作为深度学习的入门样例。 MNIST的数据集可以在http://yann...

阿猫的和谐号高铁 897

mnist手写数字识别(TensorFlow-GPU)-----------原理及代码

本文主要是对mnist手写数据集这中的迷糊数字进行识别,在Softmax Regression基础上建立了一个较为简单的机器学习模型。 通过这篇文章,可以对神经网络有一个大体的了解,还可以掌握简单的图像识别技术,本章的图片来源是于一个开源的训练数据集(mnist) 我们分以下几个部分来进行: 导入数据集。 分析mnist样本特点定义变量。 构建模型。 训练模型并输出中间状态参数。 测...

weixin_39121325的博客 8329

TensorFlow手写数字识别实战:全连接网络从零跑通指南

神经网络是深度学习的核心数学模型,通过多层非线性变换实现特征抽象与模式识别;其训练依赖于数据标准化、损失函数优化与梯度更新等基础机制。TensorFlow作为主流工业级框架,提供了高封装API与灵活底层控制的统一接口,显著降低工程落地门槛。在图像分类任务中,MNIST手写数字数据集因其结构规整、标注纯净,成为验证模型逻辑与调试流程的理想起点。本文聚焦TensorFlow 2.x环境下的全连接网络实现,覆盖Python环境配置、像素归一化、Dense层参数设计、sparse_categorical_cross

weixin_30727835的博客 440

tensorflow笔记(四)之MNIST手写识别系列一

tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html 前言 这篇博客将利用神经网络去训练MNIST数据集,通过学习到的模型去分类手写数字。 我会将本篇博客的jupyter notebook放在最后,方便你下载在线调试!推荐结合官...

weixin_34265814的博客 233

Python+TensorFlow实战:MNIST手写体数字识别从零到99%准确率

深度学习入门常以MNIST手写体数字识别为起点,其核心在于掌握图像分类的基本流程。卷积神经网络通过局部感受野提取笔画特征,配合归一化与Dropout可显著提升泛化能力。TensorFlow提供了从数据加载到模型部署的完整工具链,使得端到端训练与推理成为可能。该技术广泛应用于文档数字化、票据识别及端侧智能设备。本文以Python和TensorFlow为基础,详细讲解数据预处理、CNN模型搭建、训练调参及TFLite部署,帮助读者独立完成手写体数字识别项目并避开常见陷阱。

weixin_28221501的博客 241

CNN实战:TensorFlow实现MNIST手写数字识别全流程解析

卷积神经网络通过局部感受野与参数共享机制,能够高效提取图像的边缘、纹理等空间特征,相较于全连接网络参数量大幅降低,成为图像分类任务的基础模型。MNIST手写数字识别作为深度学习的经典入门项目,覆盖了数据归一化、网络结构设计、交叉熵损失与优化器选型等关键环节。以TensorFlow框架为例,完整演示从数据加载、预处理、模型构建到训练调参的工程实践,并针对训练中常见的维度错误、过拟合、预处理不一致等问题给出排查思路,帮助开发者建立从算法原理到代码落地的闭环能力。

weixin_42548816的博客 295

Tensorflow神经网络,mnist,CPU和GPU同时跑通,一轮96%,20轮99%

两张网络 名称 算法 学习速率 目标函数 层数 特点 准确率 CPU时间 GUP时间 简单NN 梯度下降 1/100 交叉熵 1 最简单 最快 96% <1 <1 双层CNN Adam 最速下降 1/10000 交叉熵 2层卷积 池化 99.28% 16分钟 2分钟 所用CPU为IntelCorei7-8700 CPU@3.2GHz 所用GPU为NVIDIA R...

PerfeyCui的博客 1020

深度学习笔记(二):基于tensorflow gpu版本的深度神经网络程序总览

在第一篇笔记深度学习笔记(一):基于numpy的深度神经网络程序总览 之后,又用tensorflow的gpu版本实现了一遍,果然封装很好,写起来很舒服,速度也快很多,100次epoch分分钟就结束了,效果和第一篇笔记中基于numpy的效果差不多,以下是代码,比基于numpy的代码少了一多半。

基于tensorflow+CNN的MNIST数据集手写数字分类

2018年9月18日笔记 tensorflow是谷歌google的深度学习框架,tensor中文叫做张量,flow叫做流。 CNN是convolutional neural network的简称,中文叫做卷积神经网络。 MNIST是Mixed National Institue of Standards and Technology database的简称...

潇洒坤 993

Tensorflow_MNIST_GPU

电脑的显存只有2G,原始的GPU版的MNIST代码中,测试样本没有进行batch处理,而是将10000个测试样本直接存入显存(因为此处用的GPU运行程序),所以导致显存不够用而报错。此处提供一个batch处理的MNIST代码,可帮助读者进行测试。

手把手教你用CsvView分析大疆无人机飞行日志(附实战CTF题解)

本文详细介绍了如何使用CsvView工具分析大疆无人机飞行日志,包括环境搭建、日志提取、核心功能解析及CTF实战技巧。通过实战案例,帮助读者掌握无人机取证的关键技术,提升日志分析能力,特别适合网络安全竞赛和实际取证场景。

weixin_42652674的博客 458

Keras.NET MNIST教程:用C构建CNN图像识别,3个epoch达到98%准确率

**Keras.NET** 是面向 C# 和 F# 开发者的高层神经网络 API,基于 Python 绑定并运行在 TensorFlow 之上。本教程带你用 C# 完成一个完整的 **CNN 手写数字识别** 项目:加载 MNIST 数据集、搭建卷积神经网络、训练并在 3 个 epoch 内达到 98% 准确率。无需 Python 背景,有 C# 基础即可上手 🚀 ## 一、为什么选择 Ker

gitblog_00356的博客 771

从零解析:富斯i6遥控器与STM32的IBUS协议通信实战

本文详细解析了富斯i6遥控器与STM32通过IBUS协议通信的实战指南,涵盖硬件准备、协议解析、驱动实现及常见问题解决。特别适合机器人及智能小车开发者,提供低成本、高可靠性的无线控制方案,助力快速实现多通道控制功能。

weixin_29193359的博客 440

TensorFlow界的hello world——MNIST手写数字识别

一般而言,MNIST 数据集测试就是机器学习和深度学习当中的"Hello World"工程,几乎是所有的教程都会把它放在最开始的地方.这是因为,这个简单的工程包含了大致的机器学习流程,通过练习这个工程有助于我们加深理解深度学习的大致流程.MNIST 是一个小型的手写数字图片库,它总共有 60000 张图片,其中 50000 张训练图片,10000 张测试图片.每张图片的像素都是 28 * 28 它...

weixin_37813036的博客 623

Win10蓝屏代码critical process died的解决方法

critical process died”蓝屏错误是Win10操作系统中较为常见的问题之一。当遇到这一问题时,可以尝试通过修复当前系统、检查硬盘槽位或重新安装系统等方法来解决。本文详细介绍了这三种方法的操作步骤和注意事项,希望能帮助大家摆脱这一困扰。同时,也建议大家在日常使用中注意系统的维护和更新,以减少类似问题的发生。

mmoo_python的博客 9536

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。差异(differences):MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。共性(commonalities):MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。

斯人若彩虹,遇上方知有! 4841

手把手搭建第一个全连接神经网络:从MNIST到生产级调试

神经网络是深度学习的基础计算模型,其核心在于通过多层非线性变换实现特征抽象与映射。理解其工作原理需掌握数据流、计算图、优化器行为与评估闭环四大要素。全连接网络因结构透明、可完全可视化、计算开销可控,成为建立工程直觉的理想起点;而MNIST作为标准化诊断工具,能精准暴露预处理、标签编码、激活函数选择等关键环节的细微错误。结合TensorFlow/Keras的高可读性API与详尽报错机制,初学者可快速建立参数意义(如batch_size=128对内存与梯度稳定性的权衡)、激活函数适配(ReLU用于隐藏层,Sof

526

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2508

深度学习 Day 12——利用卷神经网络实现MNIST手写数字的识别

365天深度学习训练营 [第二周]——继续学习利用卷神经网络(CNN)实现MNIST手写数字的识别。

北天的博客 1268

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6885

在hyper-v管理器中修改WSL虚拟交换机后,打开wsl闪退

此次是因为修改了WSL虚拟交换机造成的wsl打不开或闪退,还有一种可能是关闭了hyper-v造成了wsl。

DN金猿的博客 1173

TensorFlow实战:MNIST手写数字识别入门指南

深度学习中的卷积神经网络(CNN)是图像识别任务的核心技术,通过局部感知和权值共享显著提升特征提取效率。TensorFlow作为主流深度学习框架,其计算图机制和自动微分功能极大简化了模型开发流程。MNIST数据集作为经典的入门项目,不仅帮助理解神经网络工作原理,更能实践完整的机器学习pipeline。在工程实现层面,涉及数据预处理、GPU加速训练、模型评估等关键技术环节,其中BatchNormalization和GlobalAveragePooling等技巧能有效提升模型性能。实际部署时需注意输入数据标准化

weixin_33895516的博客 335

地表最强之Android微信语音/腾讯会议通话录音

地表最强之Android微信语音/腾讯会议通话录音

cczhengv 6108

Python——tensorflow2.8逻辑回归算法(mnist)

tensorflow在2.0以上去掉了mnist数据集的处理指令,如果要下载的话得转为keras来处理,但是下载的数据没办法减容next_batch()函数,所以我们可以使用另一种方法:把tensorflow.examples.tutorials.mnist import input_data这个程序里面所需要的库补齐。 首先查看你的site-packages里面的tensorflow有没有examples文件夹,如果没有的话就把附件里面整个example文件夹放进去,如果有但是程序提示没...

wenpeitao的博客 1544

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

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TensorFlow CNN手写数字识别实战:从MNIST到自定义图片

计算机视觉中的图像分类任务,核心在于让算法从像素中提取有效特征。卷积神经网络(CNN)通过卷积核的局部感知与池化降采样,天然适合处理二维图像结构,兼顾特征抽象与参数控制,成为图像识别领域的基础架构。TensorFlow作为主流深度学习框架,提供了从数据加载、模型搭建到训练推理的完整工具链。MNIST作为经典的入门数据集,常被用于验证模型性能,但工程落地更关键的是图像预处理与分布对齐——如归一化、反转、居中缩放等操作。本文以手写数字识别为切入点,介绍如何基于TensorFlow构建CNN模型,完成MNIST训

weixin_29053067的博客 282

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

tensorflow实现简单的卷积神经网络

1.卷积神经网络(Convolutional Neural Network ,CNN) 优点: (1)直接使用图像的原始像素作为输入,不必先使用SIFT等算法提取特征,减少了大量重复、繁琐的数据预处理工作; (2)卷积神经网络训练的模型对缩放、平移、旋转等畸变具有不变性,有很强的泛化性; (3)卷积神经网络最大的特点是卷积的权值共享结构,大幅减少神经网络的参数量,防止过拟合的同时又降低神经...

czjl6886的博客 283

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: Tensorflow神经网络,mnist,CPU和GPU同时跑通,一轮96%,20轮99%
下一篇: 增量学习是啥东西?基于TensorFlow的简单增量学习实现
飞凡可期
博客等级 码龄11年 34粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值