变分自编码器(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 接受训练,只能使用解码器网络来生成新的图像。
具体做法
  1. 导入必要的模块。本方法中,需要调用 Numpy、Matplolib 和 TensorFlow 函数:
  1. 定义 VariationalAutoencoder 类。采用 __init__ 类方法来定义超参数,如学习率、批量大小、用于输入的占位符、编码器及解码器网络的权重和偏置变量。它还根据 VAE 的网络体系结构建立计算图。在本方法中使用 Xavier 初始化器初始化权重。与使用自己定义的方法进行 Xavier 初始化不同,本方法使用 tf.contrib.layers.xavier_initializer() 来进行初始化。最后,定义损失(生成和潜在)及优化器操作:
  1. 创建网络编码器和网络解码器。网络编码器的第一层接收输入并生成输入的递减式潜在表示;第二层将输入映射到高斯分布。网络学习这些转变:
  1. VariationalAutoencoder 类还包含一些帮助函数来生成和重建数据,并适应 VAE:
  1. 一旦 VAE 类完成,定义一个函数序列,它使用 VAE 类对象并通过给定的数据进行训练:
  1. 使用 VAE 类和序列函数。采用 MNIST 数据集:
  1. 定义网络架构,并在 MNIST 数据集上进行 VAE 的训练。在这种情况下,为了简单保留了潜在维度 2。
  1. 看一下 VAE 是否重构了输入。输出表明那些数字确实被重构了,而且由于使用了二维的潜在空间,所以图像显得模糊了:
下图是上述代码的输出:
  1. 以下是使用经过训练的 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. VAE变分自编码器

    我在学习VAE的时候遇到了很多问题,很多博客写的不太好理解,因此将很多内容重新进行了整合. 我自己的学习路线是先学EM算法再看的变分推断,最后学VAE,自我感觉这个线路比较好理解. 一.首先我们来宏观 ...

  2. Variational Auto-encoder(VAE)变分自编码器-Pytorch

    import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision from ...

  3. (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程

    变分自编码器(Variational Autoencoder, VAE)通俗教程 转载自: http://www.dengfanxin.cn/?p=334&sukey=72885186ae5c ...

  4. 变分自编码器(Variational Autoencoder, VAE)通俗教程

    原文地址:http://www.dengfanxin.cn/?p=334 1. 神秘变量与数据集 现在有一个数据集DX(dataset, 也可以叫datapoints),每个数据也称为数据点.我们假定 ...

  5. 4.keras实现-->生成式深度学习之用变分自编码器VAE生成图像(mnist数据集和名人头像数据集)

    变分自编码器(VAE,variatinal autoencoder)   VS    生成式对抗网络(GAN,generative adversarial network) 两者不仅适用于图像,还可以 ...

  6. 变分自编码器(Variational auto-encoder,VAE)

    参考: https://www.cnblogs.com/huangshiyu13/p/6209016.html https://zhuanlan.zhihu.com/p/25401928 https: ...

  7. 基于变分自编码器(VAE)利用重建概率的异常检测

    本文为博主翻译自:Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability,如侵立 ...

  8. 变分推断到变分自编码器(VAE)

    EM算法 EM算法是含隐变量图模型的常用参数估计方法,通过迭代的方法来最大化边际似然. 带隐变量的贝叶斯网络 给定N 个训练样本D={x(n)},其对数似然函数为: 通过最大化整个训练集的对数边际似然 ...

  9. 基于图嵌入的高斯混合变分自编码器的深度聚类(Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding, DGG)

    基于图嵌入的高斯混合变分自编码器的深度聚类 Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedd ...

随机推荐

  1. dedecms arclist分页

    https://blog.csdn.net/qq_41104911/article/details/81510589

  2. node-mongo封装

    node 里面调用mongo封装了下. mongo.js文件 const { MongoClient, ObjectId } = require('mongodb'); const mongourl ...

  3. OGG-Oracle同步Sequence

    一.需求,使用OGG同步软件,将Oracle 11g Sequence实时同步到19c新库中 参考文档 Implementing replication of cyclic sequences in ...

  4. Swift系列五 - 可选项

    可选项,一般也叫可选类型,它允许将值设为nil. 一.定义可选项 平时开发中,如果我们需要把一个变量置空时只需要把变量赋值一个nil即可: 上面尝试后不行,那怎么把一个变量置空呢? 答案:把变量设置可 ...

  5. Failed opening required

    报错 点击页面右下角的图标,再点击错误可以显示报错.或者在项目中runtime--log也可以查看error [64]think\\__require_file(): Failed opening r ...

  6. 【目录】Java项目开发中的知识记录

    此篇文章为学习Java的目录,<a href="#"></>这种的是还没有写的文章.已经加a标签的是已经写完的.没写的文章急切需要的话可以直接留言,不是特别 ...

  7. [转发]Linux性能测试工具之Lmbench特性、安装及使用

    Linux性能测试工具之Lmbench特性.安装及使用2015年07月16日 10:13:48 Michaelwubo 阅读数:2466Linux性能测试工具Lmbench 是一套简易可移植的,符合A ...

  8. top,它们的意思分别是1分钟、5分钟、15分钟内系统的平均负荷。

    理解Linux系统负荷   作者: 阮一峰 日期: 2011年7月31日   一.查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime ...

  9. python上下文管理协议,即with的详细使用

    一.with obj as f: #代码块... 二.执行流程: 1.with obj --->触发obj.__enter__(),需要在obj里写__enter__(self),在它里边写返回 ...

  10. rsync同步遇到的报错和解决办法

    rsync同步遇到的报错和解决办法   科技小能手 2017-11-12 18:27:00 浏览1125 配置 code 同步 open stream file read   在同步的客户端操作: [ ...