变分自编码器(VAE)组合了神经网络和贝叶斯推理这两种最好的方法,是最酷的神经网络,已经成为无监督学习的流行方法之一。

变分自编码器是一个扭曲的自编码器。同自编码器的传统编码器和解码器网络一起,具有附加的随机层。

编码器网络之后的随机层使用高斯分布对数据进行采样,而解码器网络之后的随机层使用伯努利分布对数据进行采样。

与 GAN 一样,变分自编码器根据它们所接受的分布来生成图像和数字。VAE允许设置潜在的复杂先验,从而学习强大的潜在表征。

下图描述了一个 VAE。编码器 qφ(z|x) 网络近似于真实,但后验分布 p(z|x) 很难处理,其中 x 是 VAE 的输入,z 是潜在表示。解码器网络 pθ(x|z) 将 d 维潜在变量(也称为潜在空间)作为其输入并生成与 P(x) 相同分布的新图像。从 z|x~N(μz|x,Σz|x) 采样得到潜在表示 z,而解码器网络的输出从 x|z~N(μx|z,Σx|z) 采样得到 x|z:

图 1 自编码器的编码器–解码器示例图
现在已经有了 VAE 的基本结构,问题在于如何对它们进行训练,因为训练数据和后验密度的最大可能性是难以处理的。通过最大化 log 数据可能性的下限来训练网络。损失项由两部分组成:通过采样从解码器网络获得的生成损失,以及被称为潜在损失的 KL 发散项。

发生损耗确保了由解码器生成的图像和用于训练网络的图像是相同的,并且潜在损失能够确保后验分布 qφ(z|x) 接近于先验分布 pθ​(z)。由于编码器使用高斯分布进行采样,所以潜在损耗测量潜在变量与单位高斯匹配的匹配程度。

一旦 VAE 接受训练,只能使用解码器网络来生成新的图像。
具体做法
导入必要的模块。本方法中,需要调用 Numpy、Matplolib 和 TensorFlow 函数:

定义 VariationalAutoencoder 类。采用 init 类方法来定义超参数,如学习率、批量大小、用于输入的占位符、编码器及解码器网络的权重和偏置变量。它还根据 VAE 的网络体系结构建立计算图。在本方法中使用 Xavier 初始化器初始化权重。与使用自己定义的方法进行 Xavier 初始化不同,本方法使用 tf.contrib.layers.xavier_initializer() 来进行初始化。最后,定义损失(生成和潜在)及优化器操作:

创建网络编码器和网络解码器。网络编码器的第一层接收输入并生成输入的递减式潜在表示;第二层将输入映射到高斯分布。网络学习这些转变:

VariationalAutoencoder 类还包含一些帮助函数来生成和重建数据,并适应 VAE:

一旦 VAE 类完成,定义一个函数序列,它使用 VAE 类对象并通过给定的数据进行训练:

使用 VAE 类和序列函数。采用 MNIST 数据集:

定义网络架构,并在 MNIST 数据集上进行 VAE 的训练。在这种情况下,为了简单保留了潜在维度 2。

看一下 VAE 是否重构了输入。输出表明那些数字确实被重构了,而且由于使用了二维的潜在空间,所以图像显得模糊了:

下图是上述代码的输出:

以下是使用经过训练的 VAE 生成的手写数字样本:

以下是由自编码器生成的 MNIST 样字符的范围:

图 2 由自编码器生成的一系列MNIST样字符示意图
代码基于 Kingma 和 Welling 撰写的论文“Autoencoding Variational Bayes”,并通过 GitHub 进行了调整:https://jmetzen.github.io/2015-11-27/vae.html。
解读分析
VAE 学习重构,同时产生新的图像。生成的图像依赖于潜在空间。生成的图像与训练它们的数据集具有相同的分布。

通过在 VariationalAutoencoder 类中定义一个变换函数来查看潜在空间中的数据:

使用变换函数的 MNIST 数据集的潜在表示如下:

生成的 VAE 图像取决于潜在的空间维度。使潜在空间尺寸减小的模糊在增加。5-d、10-d 和 20-d 潜在维度的重构图像分别如下:

VAE变分自编码器实现相关推荐

  1. PyTorch 实现 VAE 变分自编码器 含代码

    编码器 自编码器 自编码器网络结构图 线性自编码器代码如下: 卷积自编码器代码如下: 变分自编码器 变分自编码器网络结构图 变分自编码器代码如下: Ref 自编码器 自编码器网络结构图 线性自编码器代 ...

  2. VAE(变分自编码器)学习笔记

    VAE学习笔记 普通的编码器可以将图像这类信息编码成为特征向量. 但通常这些特征向量不具有空间上的连续性. VAE(变分自编码器)可以将图像信息编码成为具有空间连续性的特征向量. 方法是向编码器和解码 ...

  3. VAE 变分自编码器

    收集了几篇文章,介绍VAE变分自编码器,如下: 1.[干货]深入理解变分自编码器 - 知乎转载自:机器学习研究组订阅 原文链接:[干货]深入理解变分自编码器[导读]自编码器是一种非常直观的无监督神经网 ...

  4. 入门到精通!珍藏资源!VAE变分自编码器

    过去虽然没有细看,但印象里一直觉得变分自编码器(Variational Auto-Encoder,VAE)是个好东西.趁着最近看概率图模型的三分钟热度,我决定也争取把 VAE 搞懂.    于是乎照样 ...

  5. 通俗易懂——VAE变分自编码器原理

    变分自编码器(Variational Auto Encoder, VAE) 李宏毅机器学习笔记.转载请注明出处. 自编码器(Autoencoder): Autoencoder = Encoder + ...

  6. 深入理解VAE(变分自编码器)

    原文地址:https://pan.baidu.com/s/1LNolV-_SZcEhV0vz2RkDRQ : 本文进行翻译和总结. VAE VAE是两种主要神经网络生成模型中的一种,另一种典型的方法是 ...

  7. 【13】变分自编码器(VAE)的原理介绍与pytorch实现

    文章目录 1.VAE的设计思路 2.VAE的模型架构 3.VAE的作用原理 4.VAE的Pytorch实现 1)参考代码 2)训练结果展示 3)生成结果展示 5.实现VAE中出现的问题 1.VAE的设 ...

  8. 【Pytorch项目实战】之生成式网络:编码器-解码器、自编码器AE、变分自编码器VAE、生成式对抗网络GAN

    文章目录 博主精品专栏导航 生成式网络 - 生成合成图像 算法一:编码器-解码器 算法二:自编码器(Auto-Encoder,AE) 算法三:变分自编码器(Variational Auto Encod ...

  9. 变分自编码器和条件变分自编码器 (VAE CVAE)

    变分自编码器(VAE) 变分自编码器(VAE)是通过大量的观测数据 xi\mathbf{x}_{i}xi​ 总结出数据的分布 p(X)p(\mathbf{X})p(X),进而可以通过无穷次的采样获取所 ...

最新文章

  1. oracle和arcgis优势,Oracle spatial 使用的一些感受
  2. 应用调试(四)系统调用SWI
  3. @Autowired与@Resource的区别
  4. 【Qt】QModbusRequest类
  5. java web mvc_构建Java Web应用程序时遵循MVC的三个步骤
  6. web服务减少服务器TIME_WAIT
  7. python的json模块
  8. 存储器RAM ROM FLASH介绍
  9. 19、【易混淆概念集】第十一章3 应急计划 VS 弹回计划 实施风险应对 监督风险
  10. 【答读者问5】如何实现以当天收盘价交易?
  11. 【K哥爬虫普法】蓄意突破反爬虫技术,爬取牌照信息
  12. cscd期刊是c刊吗_cscd期刊和cssci级别哪个高
  13. PHP 8 - 学习/实践
  14. 如何在拨号vps里查看本机ip地址
  15. 芯片电源去耦电容为什么要靠近电源放置
  16. app打开QQ聊天对话框
  17. Ubuntu系统错误 没有公钥,无法验证下列签名: NO_PUBKEY 5F16B97C1AD28806
  18. QTreeWidget 勾选三种状态
  19. JustNews主题
  20. 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作

热门文章

  1. System.Data.SqlClient.SqlException:“ ',' 附近有语法错误。必须声明标量变量 @Password。”
  2. 机房收费系统【VB版】——上下机
  3. 数组的拼接合并 numpy
  4. 虚拟机环境下Centos7操作系统的详细安装教程
  5. Pytorch - GPU ID 指定 pytorch gpu 指定
  6. LeetCode简单题之解码字母到整数映射
  7. LeetCode简单题之在既定时间做作业的学生人数
  8. 如何使用TVM Pass Relay
  9. 电脑识别指令和代码的原理
  10. Caffe框架GPU与MLU计算结果不一致请问如何调试?