【生成模型】解读显式生成模型之完全可见置信网络FVBN

CNTK入门02:FeedForwardNet学习笔记 CNTK例子FeedForwardNet学习笔记 例子目录:Tutorials\NumpyInterop\FeedForwardNet.py In FeedForwardNet.py  we show a minimal example how to train a CNTK network using numpy arraysas input. Python文件代码: # C 阅读详情

上一期为大家说明了什么是极大似然法,以及如何使用极大似然法搭建生成模型,本期将为大家介绍第一个显式生成模型完全可见置信网络FVBN。

                                          作者&编辑 | 小米粥

1 完全可见置信网络

在完全可见置信网络中,不存在不可观察的潜在变量,观察变量的概率被链式法则从维度上进行分解,对于 n 维观察变量x ,其概率表达式为:

自回归网络是最简单的完全可见置信网络,其中每一个维度的观察变量都构成概率模型的一个节点,而这些所有的节点{x1,x2,...,xn}共同构成一个完全有向图,即图中任意两个节点都存在连接关系,如图所示。

在自回归网络中,因为已经有了随机变量的链式分解关系,那么核心问题便成为如何表达条件概率p(xi|xi-1,xx-2,...,x1) 。最简单的模型是线性自回归网络,即每个条件概率均被定义为线性模型,对实数值数据使用线性回归模型(例如定义 p(xi|xi-1,xx-2,...,x1)= w1x1+w2x2+...+wi-1xi-1 ,对二值数据使用逻辑回归,而对离散数据使用softmax回归,其计算过程如下图。

但线性模型容量有限,拟合函数的能力不足。在神经自回归网络中,使用神经网络代替线性模型,它可以任意增加容量,理论上可以拟合任意联合分布。神经自回归网络还使用了特征重用的技巧,神经网络从观察变量 xi 学习到的隐藏抽象特征 hi 不仅在计算p(xi+1|xi,xi-1,...,x1)时使用,也会在计算p(xi+2|xi+1,xi,...,x1)时进行重用,其计算图如下所示,并且该模型不需要将每个条件概率的计算都分别使用不同神经网络表示,可以将所有神经网络整合为一个,因此只要设计成抽象特征hi只依赖于x1,x2,...,xi即可。而目前的神经自回归密度估计器是神经自回归网络中最具有代表性的方案,它是在神经自回归网络中引入了参数共享的方案,即从观察变量xi到任意隐藏抽象特征 hi+1,hi+2,... 的权值参数是共享的,使用了特征重用、参数共享等深度学习技巧的神经自回归密度估计器具有非常优秀的性能。

PixelRNN和PixelCNN也属于完全可见置信网络,从名字可以看出,这两个模型一般用于图像的生成。它们将图像x的概率p(x)按照像素分解为 n 个条件概率的乘积,其中n为图像的像素点个数,即在每一个像素点上定义了一个条件概率用以表达像素之间的依赖关系,该条件概率分别使用RNN或者CNN进行学习。为了将输出离散化,通常将RNN或CNN的最后一层设置为softmax层,用以表示其输出不同像素值的概率。在PixelRNN中,一般定义从左上角开始沿着右方和下方依次生成每一个像素点,如下图所示。这样,对数似然的表达式便可以得到,训练模型时只需要将其极大化即可。

PixelRNN在其感受野内可能具有无边界的依赖范围,因为待求位置的像素值依赖之前所有已知像素点的像素值,这将需要大量的计算代价,PixelCNN使用标准卷积层来捕获有界的感受野,其训练速度要快于PixelRNN。在PixelCNN中,每个位置的像素值仅与其周围已知像素点的值有关,如下图所示。灰色部分为已知像素,而白色部分为未知像素,计算黑色位置的像素值时,需要把方框区域内的所有灰色像素值传递给CNN,由CNN最后的softmax输出层来表达表在黑色位置取不同像素值的概率,这里可以使用由0和1构成的掩模矩阵将方框区域内的白色位置像素抹掉。PixelRNN和PixelCNN此后仍有非常多改进模型,但由于它是逐个像素点地生成图片,具有串行性,故在实际应用中效率难以保证,这也是FVBN模型的通病。

2 pixelCNN 代码

接下来我们将提供一份完整的pixelCNN的代码讲解,其中训练集为mnist数据集。

首先读取相关python库,设置训练参数:

# 读取相关库 

import time 

import torch 

import torch.nn.functional as F 

from torch import nn, optim, cudafrom torch.utils 

import datafrom torchvision import datasets, transforms, utils 

# 设置训练参数 

train_batch_size = 256 

generation_batch_size = 48 

epoch_number = 25feature_dim = 64 

# 是否使用GPU 

if torch.cuda.is_available():    

    device = torch.device('cuda:0') 

else:    

    device = torch.device('cpu')

然后定义二维掩膜卷积,所谓掩膜即使卷积中心的右方和下方的权值为0,如下图所示为3x3掩膜卷积核(A型):

定义二维掩膜卷积核,其中有A与B两种类型,区别之处在于中心位置是否被卷积计算:

class MaskedConv2d(nn.Conv2d):

    def __init__(self, mask_type, *args, **kwargs):

       super(MaskedConv2d, self).__init__(*args, **kwargs)

       assert mask_type in {'A', 'B'}

       self.register_buffer('mask', self.weight.data.clone())

       bs, o_feature_dim, kH, kW = self.weight.size()

       self.mask.fill_(1)

       self.mask[:, :, kH // 2, kW // 2 + (mask_type == 'B'):] = 0        

        self.mask[:, :, kH // 2 + 1:] = 0

    def forward(self, x):        

        self.weight.data *= self.mask        

        return super(MaskedConv2d, self).forward(x)

我们的pixelCNN网络为多层掩膜卷积的堆叠,即:

network = nn.Sequential(

    MaskedConv2d('A',1,feature_dim,7,1,3, bias=False),nn.BatchNorm2d(feature_dim),nn.ReLU(True),     

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    

    MaskedConv2d('B', feature_dim, feature_dim, 7, 1, 3, bias=False), nn.BatchNorm2d(feature_dim), nn.ReLU(True),    nn.Conv2d(feature_dim, 256, 1)) 

network.to(device)

接着设置dataloader和优化器:

train_data = data.DataLoader(datasets.MNIST('data', train=True, download=True, transform=transforms.ToTensor()),                     batch_size=train_batch_size, shuffle=True, num_workers=1, pin_memory=True) 

test_data = data.DataLoader(datasets.MNIST('data', train=False, download=True, transform=transforms.ToTensor()),                     batch_size=train_batch_size, shuffle=False, num_workers=1, pin_memory=True) 

 optimizer = optim.Adam(network.parameters())

开始训练网络,并在每一轮epoch后进行测试和生成样本

if __name__ == "__main__":

    for epoch in range(epoch_number):

        # 训练

        cuda.synchronize()

        network.train(True)

        for input_image, _ in train_data:

            time_tr = time.time()

            input_image = input_image.to(device)

            output_image = network(input_image)

            target = (input_image.data[:, 0] * 255).long().to(device)

            loss = F.cross_entropy(output_image, target)

            optimizer.zero_grad()

            loss.backward()

            optimizer.step()

            print("train: {} epoch, loss: {}, cost time: {}".format(epoch, loss.item(), time.time() - time_tr))        cuda.synchronize()

        # 测试

        with torch.no_grad():

            cuda.synchronize()

            time_te = time.time()

            network.train(False)

            for input_image, _ in test_data:                                              input_image = input_image.to(device)

                target = (input_image.data[:, 0] * 255).long().to(device)

                loss = F.cross_entropy(network(input_image), target)

            cuda.synchronize()

            time_te = time.time() - time_te

            print("test: {} epoch, loss: {}, cost time: {}".format(epoch, loss.item(), time_te))        

# 生成样本

        with torch.no_grad():

            image = torch.Tensor(generation_batch_size, 1, 28, 28).to(device)

            image.fill_(0)

            network.train(False)

            for i in range(28):

                for j in range(28):

                    out = network(image)

                    probs = F.softmax(out[:, :, i, j]).data

                    image[:, :, i, j] = torch.multinomial(probs, 1).float() / 255.

            utils.save_image(image, 'generation-image_{:02d}.png'.format(epoch), nrow=12, padding=0)

[1] Oord A V D , Kalchbrenner N , Kavukcuoglu K . Pixel Recurrent Neural Networks[J]. 2016.

[2] 伊恩·古德费洛, 约书亚·本吉奥, 亚伦·库维尔. 深度学习

总结

本期带大家学习了第一种显式生成模型完全可见置信网络,并对其中的自回归网络和pixelRNN,pixelCNN做了讲解,并讲解了一份完整的pixelCNN代码。下一期我们将对第二个显式模型流模型进行讲解。

个人知乎,欢迎关注

GAN群

有三AI建立了一个GAN群,便于有志者相互交流。感兴趣的同学也可以微信搜索xiaozhouguo94,备注“加入有三-GAN群”。

更多GAN的学习

知识星球是有三AI的付费内容社区,里面包超过100种经典GAN模型的解读,了解详细请阅读以下文章:

【杂谈】有三AI知识星球指导手册出炉!和公众号相比又有哪些内容?

有三AI秋季划GAN学习小组,可长期跟随有三学习GAN相关的内容,并获得及时指导,了解详细请阅读以下文章:

【杂谈】如何让2020年秋招CV项目能力更加硬核,可深入学习有三秋季划4大领域32个方向

转载文章请后台联系

侵权必究

往期精选

深度置信网络(Deep Belief Networks)DBN DBN 一、算法的功能 深度置信网络(Deep Belief Networks)DBN算法是机器学习之神经网络的一种,既可以用于非监督学习,也可以用于监督学习。DBN是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布。通过训练其神经元间的权重,可以让整个神经网络按照最大概率来生成训练数据。 不仅可以使用DBN来识别特征、分类数据... 阅读详情

相关推荐

【深度解析】AURIX TC387 UCB Flash架构与避坑指南(第一篇)

摘要:UCB(用户配置块)是AURIX TC3xx芯片启动与安全的关键配置区域,位于DFLASH0存储区。每个512字节的UCB包含启动模式、安全设置等关键参数,并通过强制CRC32校验确保完整性。UCB分为启动头(UCB_BMHD)、安全配置(UCB_ORIG)及其备份(UCB_COPY)三种主要类型。不同于常规Flash,UCB具有自动擦除特性,错误配置可能导致芯片永久锁死。开发中应谨慎修改UCB,必须同时编程原始和备份版本,并确保正确的CRC校验。后续文章将详细介绍UCB编程方法和调试技巧。

2511_94612429的博客 1236

【AI绘图学习笔记】初识生成模型

(文章中大部分内容从网上学习笔记中摘录,推荐阅读原文,吴恩达深度学习课程笔记暂时停更一段时间,学习AI绘图原理是为了搞定毕业设计,等忙完再回头把基础补完,推荐读物《深度学习》花书)

milu_ELK的博客 1387

UE5网络模块实战:属性复制、RPC与联机开发踩坑指南

多人联机开发中,网络同步是核心难题。UE5网络模块以服务器权威为基础,通过Actor复制、RPC和所有权机制实现多端状态一致。理解属性复制与OnRep回调、区分Server/Client/Multicast RPC的适用场景,是构建稳定联机架构的关键。本文结合数字孪生与多端协作场景,探讨如何将渲染与逻辑分离,并针对打包后网络失效、端口防火墙、崩溃排查等工程实践问题给出解决方案。通过蓝图接口解耦表现层,利用C++创建StaticMesh组件实现服务器逻辑与客户端表现分离,同时注意专用服务器不加载渲染依赖(如D

weixin_29010003的博客 274

生成式AI

为了增强图片生成效果,采用一种加噪(前向过程)+降噪(反向过程)的方法,对样本图片进行加噪处理,并使其噪声逐渐满足高斯分布,再学习降噪方法,将样本图片还原,这样让模型掌握利用一定的随机噪音来完成高质量图片生成能力;模型需要学习到的实际上是能力;此处的应当是一个分布而不是一个具体的样本,由推得的一系列分布,可以使模型的生成效果更加多元化。

weixin_53196770的博客 564

STM32的bootloader程序(通过串口更新STM32应用程序)

STM32的bootloader程序(通过串口更新STM32应用程序),对bootloader进行浅浅的学习

星羽空间 1万+

FreeRTOS --(15)信号量之概述

FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步; 针对不同的应用场景,信号量分为两种: 1、二值信号量; 2、计数信号量; 1、二值信号量 1.1、Usage 顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.

StephenZhou 6519

【Pytorch神经网络实战案例】10 搭建深度卷积神经网络

识别黑白图中的服装图案(Fashion-MNIST)https://blog.csdn.net/qq_39237205/article/details/123379997基于上述代码修改模型的组成 1 修改myConNet模型 1.1.1 修改阐述 将模型中的两个全连接层,变为全局平均池化层。 1.1.2 修改结果 ### 1.5 定义模型类 class myConNet(torch.nn.Module): def __init__(self): super(myCo

小李的研究生学习日记 9274

长期换衣行人重识别(Long-Term Clothes-Changing Person Reid)数据集汇总

长期换衣行人重识别任务中目前常用的数据集总览目前换衣数据集的主要问题数据集换衣/总体情况集统计DeepChange(2021)LaST(2021)COCAS(2020)VC-Clothes(2020)LTCC(2020)PRCC(2019)Celebrities-reID(2019) 总览 在长期换衣行人重识别的任务当中,数据集的获取(尤其是对于学术环境下)是一个难点,主要的困难有以下几点: 采集大规模的数据集比较困难。 采集不同的衣服的数据集比较困难。 采集不同衣服不同角度的数据集比较困难。 目前也有

KingsMan666的博客 8384

神经网络代码总是停在to(device)很久之后才能继续运行(解决)

如图所示,每次用cpu就能跑,但跑非常慢,然后就会把cuda设置为True,这样就在gpu上面跑了,但每次跑到to(device) 的时候就会卡很久很久,总之还是很慢很慢,所以在朋友的帮助下解决了这个问题。 CUDA版本检查,我的显卡是3060,据说GeForce RTX 30系列显卡仅支持CUDA 11.1及以上版本,于是去安装了CUDA11.1。 检查下环境变量,没毛病: 然后再在终端执行:nvcc -V 检查下,没毛病: 接着,在pytorch官网找到cuda11.1对应的pyt...

我有明珠一颗的博客 9157

Matlab之fdesign的应用说明

fdesign 是 MATLAB 中用于数字滤波器设计的工具(属于),它提供了一种系统化的方式来定义滤波器参数并生成相应的滤波器。指定滤波器的频率、幅度等参数。例如,设计一个低通滤波器:Fs = 1000;% 采样率 (Hz)% 通带截止频率% 阻带截止频率Apass = 1;% 通带衰减 (dB)Astop = 60;% 阻带衰减 (dB)

嵌入式老牛的博客 1054

【Unity大规模RTS/攻城战框架】Large Scale Combat System - RTS Sieges深度解析

本文介绍了Unity专业级大规模RTS战斗框架Large Scale Combat System(LSCS)。该系统通过Job System+Burst技术解决了万人级单位的性能问题,提供完整的RTS操作体系、动态阵型系统、战术AI和攻城战功能。其亮点包括可破坏城门、行走城墙、战术AI配置系统,支持URP渲染管线,适用于Total War风格的大规模兵团对战项目。LSCS不仅提供核心战斗系统,还包含UI、小地图等配套模块,是Unity中少有的专业级RTS解决方案,特别适合需要深度战术玩法和大规模战斗的开发者

2403_88403568的博客 1336

GAN介绍 - 生成式模型是如何工作的? GAN与其他模型有什么区别?

GAN介绍 - 介绍 https://blog.csdn.net/sean2100/article/details/83662975 GAN介绍 - 为什么学习生成式模型? https://blog.csdn.net/sean2100/article/details/83681043 GAN介绍 - 生成式模型是如何工作的? GAN与其他模型有什么区别?https://blog.csdn.net/...

刀刀鱼 5663

2026年华为OD机试真题 新系统【点亮战争迷雾】

华为OD机试真题 8月18号 新系统【点亮战争迷雾】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【点亮战争迷雾】多语言题解。

qq_45776114的博客 497

【通知】《生成对抗网络GAN原理与实践》代码开源,勘误汇总!

有三上个月出版了新书《生成对抗网络GAN:原理与实践》,Generative Adversarial Networks(中文名生成对抗网络,简称GAN)自从被提出来后,其发展就非常迅猛,几乎已经被应用于所有CNN可以使用的领域,应用涉及图像与视频生成,数据仿真与增强,各种各样的图像风格化任务,人脸与人体图像编辑,图像质量提升。学好GAN算法,对于计算机视觉领域从业,完全是有必要的。我们公众号输出过...

hacker_long的专栏 1223

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【总结】超100期经典GAN模型的解读,从结构设计到应用,你不动心吗?

GAN无疑是这几年深度学习领域里最酷的技术,不管是理论的研究,还是GAN在图像生成,图像翻译,语音图像等基础领域的应用,都非常的丰富。我们公众号输出过非常多的GAN相关资源,本次做一个简单...

hacker_long的专栏 1959

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

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

【总结】从视频到图文,代码实战,有三AI-GAN学习资料汇总!

GAN无疑是这几年深度学习领域里最酷的技术,不管是理论的研究,还是GAN在图像生成,图像翻译,语音图像等基础领域的应用,都非常的丰富。我们公众号输出过非常多的GAN相关资源,本次做一个简单...

hacker_long的专栏 934

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......

GAN无疑是这几年深度学习领域里最酷的技术,不管是理论的研究,还是GAN在图像生成,图像翻译,语音图像等基础领域的应用,都非常的丰富。我们公众号输出过非常多的GAN相关资源,本次做一个简单...

hacker_long的专栏 739

【总结】有三AI所有原创GAN相关的学习资料汇总(2022年12月)

GAN的研究和应用在这几年发展可以说是非常迅猛,无疑是这几年深度学习计算机视觉领域里落地性最酷的技术之一,包括图像与视频生成,数据仿真与增强,各种各样的图像风格化任务,人脸与人体图像编辑,图像质量提升等。GAN最早期也是最经典的任务,就是高质量图像生成,当前已经可以生成1024分辨率以上的高清逼真图像,如下图生成了一些假明星脸。图像翻译与风格化则是另外一个应用极其广泛的领域,因为从图像到图像的任务...

hacker_long的专栏 1040

隐式建模与显式建模

本文主要记录在阅读有关意图识别与槽位填充联合模型过程中,遇到的隐式建模和显式建模。

qq_52019496的博客 4118

机器学习:结点的实现,决策树代码实现(二)

文章目录楔子定义变量:定义方法获得划分的feature生成结点停止条件及其处理fit()生成树剪枝 楔子 前面已经实现了各种信息量的计算,那么我们划分的基本有了,那么我们需要使用这个基本来划分,来生成决策树,树的基本单元是node,这里的node是一堆数据的集合+他们内在的方法。由于需要处理三种算法,我们最好能使用基类,该类应该至少包含: 1、选择划分的feature; 2、根据基准划分数据生成新...

weixin_40759186的博客 573

翻译:PyTorch基础知识学习 - 构建神经网络

神经网络由对数据执行操作的层/模块组成。torch.nn命名空间提供了构建自己的神经网络所需的所有构建块。PyTorch中的每个模块都是 nn.Module 的子类。神经网络是一个模块本身,它由其他模块(层)组成。这种嵌套结构允许轻松构建和管理复杂的架构。 在接下来的部分中,我们将构建一个神经网络来对 FashionMNIST 数据集中的图像进行分类。 一、引用相关的库,代码如下: import os import torch from torch import nn from torch.utils.da

茕夜 379

PyTorch - 34 - 在GPU上进行PyTorch - 使用CUDA训练神经网络

Welcome to deeplizard. My name is Chris. In this episode, we're going to learn how to use the GPU with PyTorch. We'll see how to use the GPU in general, and we'll see how to apply these general techniques to training our neural network.

weixin_48367136的博客 2860

生成模型的一些基础概念

生成模型

森屹的博客 924

DBN(深度置信网络)

参考文献:http://blog.csdn.net/zouxy09/article/details/8775518 具有层次结构的数学算法:                  神经网络                         到     深度神经网络DNN           限制深度波尔茨曼机      到     深度波尔茨曼机DBM           限制深

win_in_action的专栏 5万+

【机器学习】机器学习的基本分类-自监督学习-生成式方法(Generative Methods)

生成式方法是一类机器学习方法,其目标是对数据的生成过程建模,学习数据的概率分布,并能够生成与原始数据相似的新样本。生成式方法与判别式方法不同,它不仅关心样本的类别,还学习样本的特征分布。生成式方法是一类机器学习方法,其目标是对数据的生成过程建模,学习数据的概率分布,并能够生成与原始数据相似的新样本。生成式方法与判别式方法不同,它不仅关心样本的类别,还学习样本的特征分布。

IT古董 2021

显式方法与隐式方法

简介      所谓显式和隐式,是指求解方法的不同,即数学上的出发点不一样。并不是说显式只能求动力学问题,隐式只能求静力学问题,只是求解策略不通。      显式求解是对时间进行差分,不存在迭代和收敛问题,最小时间步取决于最小单元的尺寸。过多和过小的时间步往往导致求解时间非常漫长,但总能给出一个计算结果。解题费用非常昂贵。因此在建模划分网格时要非常注意。      隐式求解和时间无关,采

爱冒险的技术宅 3万+
上一篇: 【生成模型】极大似然估计,你必须掌握的概率模型
下一篇: 【杂谈】有三AI季划成员的4大专属权益,你是否已经利用好了?
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

言有三

三人行必有AI

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

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

打赏作者

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

抵扣说明:

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

余额充值