变分自编码器(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. Fastjson反序列化漏洞复现

    Fastjson反序列化漏洞复现 0x00 前言 对Fastjson反序列化漏洞进行复现. 0x01 漏洞环境 靶机环境:vulhub-fastjson-1.2.24 ip:172.16.10.18 ...

  2. PHP版DES算法加密数据

    php7之后的版本 php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被废弃并且被 OpenSSL 所取代. 从PHP 7.2起它将被从核心代码中移除并且移到PECL中.PHP手 ...

  3. 怎样用SQL修改某个字段的部分内容

    方法:update dede_addonarticle set body = replace(body,'#p#分页标题#e#',' ') where body like '%#p#分页标题#e#%'

  4. windows内核编程基础知识

    /* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDE ...

  5. POJ1904 强联通(最大匹配可能性)

    题意:       有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主. 思路:       是hdu4685的减弱版,之前研究过hdu468 ...

  6. Android进程的so注入--Poison(稳定注入版)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53869796 Android进程的so注入已经是老技术了,网上能用的Android ...

  7. hdu1722 切蛋糕

    题意:CakeTime Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  8. CentOS安装Redis报错[server.o] Error 1

    原因 准备安装的Redis服务版本为6.0.8, gcc的版本为4.8.5,可能是gcc版本过低到导致的 解决办法 安装低版本Redis或者安装高版本gcc

  9. CCNA 第四章 轻松划分子网

    1:划分子网的的好处: (1):减少网络流量 (2):优化网络性能 (3):简化管理 (4):有助于覆盖大型地理区域 2:CIDR和ISP的概念 (1):CIDR:Classless Inter-Do ...

  10. keep-alive与生命周期函数

    理解keep-alive keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 router-view也是一个组件,如果直接被keep-alive包在里面,所有路径匹 ...