变分自编码(VAE)及代码解读
版权声明:本文为博主原创文章,未经博主允许不得转载。
基本网络框架:
下面是基于keras的VAE代码解读:(自己加了一层,发现收敛的快一点了,附实验结果)
- <span style="font-size:14px;">from __future__ import division
- from __future__ import print_function
- import os.path
- import numpy as np
- np.random.seed(1337) # for reproducibility
- import tensorflow as tf
- from tensorflow.examples.tutorials.mnist import input_data
- mnist = input_data.read_data_sets('MNIST')
- input_dim = 784
- hidden_encoder_dim_1 = 1000
- hidden_encoder_dim_2 = 400
- hidden_decoder_dim = 400
- latent_dim = 20#(latent Variable)
- lam = 0
- def weight_variable(shape):
- initial = tf.truncated_normal(shape, stddev=0.001)
- return tf.Variable(initial)
- def bias_variable(shape):
- initial = tf.constant(0., shape=shape)
- return tf.Variable(initial)
- x = tf.placeholder("float", shape=[None, input_dim])##input x
- l2_loss = tf.constant(0.0)
- #encoder1 W b
- W_encoder_input_hidden_1 = weight_variable([input_dim,hidden_encoder_dim_1])##784*1000
- b_encoder_input_hidden_1 = bias_variable([hidden_encoder_dim_1])#1000
- l2_loss += tf.nn.l2_loss(W_encoder_input_hidden_1)
- # Hidden layer1 encoder
- hidden_encoder_1 = tf.nn.relu(tf.matmul(x, W_encoder_input_hidden_1) + b_encoder_input_hidden_1)##w*x+b
- #encoder2 W b
- W_encoder_input_hidden_2 = weight_variable([hidden_encoder_dim_1,hidden_encoder_dim_2])##1000*400
- b_encoder_input_hidden_2 = bias_variable([hidden_encoder_dim_2])#400
- l2_loss += tf.nn.l2_loss(W_encoder_input_hidden_2)
- # Hidden layer2 encoder
- hidden_encoder_2 = tf.nn.relu(tf.matmul(hidden_encoder_1, W_encoder_input_hidden_2) + b_encoder_input_hidden_2)##w*x+b
- W_encoder_hidden_mu = weight_variable([hidden_encoder_dim_2,latent_dim])##400*20
- b_encoder_hidden_mu = bias_variable([latent_dim])##20
- l2_loss += tf.nn.l2_loss(W_encoder_hidden_mu)
- # Mu encoder=+
- mu_encoder = tf.matmul(hidden_encoder_2, W_encoder_hidden_mu) + b_encoder_hidden_mu##mu_encoder:1*20(1*400 400*20)
- W_encoder_hidden_logvar = weight_variable([hidden_encoder_dim_2,latent_dim])##W_encoder_hidden_logvar:400*20
- b_encoder_hidden_logvar = bias_variable([latent_dim])#20
- l2_loss += tf.nn.l2_loss(W_encoder_hidden_logvar)
- # Sigma encoder
- logvar_encoder = tf.matmul(hidden_encoder_2, W_encoder_hidden_logvar) + b_encoder_hidden_logvar#logvar_encoder:1*20(1*400 400*20)
- # Sample epsilon
- epsilon = tf.random_normal(tf.shape(logvar_encoder), name='epsilon')
- # Sample latent variable
- std_encoder = tf.exp(0.5 * logvar_encoder)
- z = mu_encoder + tf.mul(std_encoder, epsilon)##z_mu+epsilon*z_std=z,as decoder's input;z:1*20
- W_decoder_z_hidden = weight_variable([latent_dim,hidden_decoder_dim])#W_decoder_z_hidden:20*400
- b_decoder_z_hidden = bias_variable([hidden_decoder_dim])##400
- l2_loss += tf.nn.l2_loss(W_decoder_z_hidden)
- # Hidden layer decoder
- hidden_decoder = tf.nn.relu(tf.matmul(z, W_decoder_z_hidden) + b_decoder_z_hidden)##hidden_decoder:1*400(1*20 20*400)
- W_decoder_hidden_reconstruction = weight_variable([hidden_decoder_dim, input_dim])##400*784
- b_decoder_hidden_reconstruction = bias_variable([input_dim])
- l2_loss += tf.nn.l2_loss(W_decoder_hidden_reconstruction)
- KLD = -0.5 * tf.reduce_sum(1 + logvar_encoder - tf.pow(mu_encoder, 2) - tf.exp(logvar_encoder), reduction_indices=1)##KLD
- x_hat = tf.matmul(hidden_decoder, W_decoder_hidden_reconstruction) + b_decoder_hidden_reconstruction##x_hat:1*784(reconstruction x)
- BCE = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(x_hat, x), reduction_indices=1)##sum cross_entropy
- loss = tf.reduce_mean(BCE + KLD)##average value
- regularized_loss = loss + lam * l2_loss
- loss_summ = tf.scalar_summary("lowerbound", loss)##Record the stored value of loss
- train_step = tf.train.AdamOptimizer(0.01).minimize(regularized_loss)##Optimization Strategy
- # add op for merging summary
- summary_op = tf.merge_all_summaries()
- # add Saver ops
- saver = tf.train.Saver()
- n_steps = int(1e5+1)##step:1000000
- batch_size = 100
- with tf.Session() as sess:
- summary_writer = tf.train.SummaryWriter('experiment',
- graph=sess.graph)##draw graph in tensorboard
- #if os.path.isfile("save/model.ckpt"):
- # print("Restoring saved parameters")
- #saver.restore(sess, "save/model.ckpt")
- #else:
- # print("Initializing parameters")
- sess.run(tf.initialize_all_variables())
- for step in range(1, n_steps):
- batch = mnist.train.next_batch(batch_size)
- feed_dict = {x: batch[0]}
- _, cur_loss, summary_str = sess.run([train_step, loss, summary_op], feed_dict=feed_dict)
- summary_writer.add_summary(summary_str, step)
- if step % 50 == 0:
- save_path = saver.save(sess, "save/model.ckpt")
- print("Step {0} | Loss: {1}".format(step, cur_loss))
- # save weights every epoch
- #if step % 100==0 :
- # generator.save_weights(
- # 'mlp_generator_epoch_{0:03d}.hdf5'.format(epoch), True)
- #critic.save_weights(
- # 'mlp_critic_epoch_{0:03d}.hdf5'.format(epoch), True)
- ##Step 999900 | Loss: 114.41309356689453
- ##Step 999950 | Loss: 115.09370422363281
- ##Step 100000 | Loss: 124.32205200195312 ##Step 99700 | Loss: 116.05304718017578
- #1000 encode hidden layer=1 Step 950 | Loss: 159.3329620361328
- #1000 encode hidden layer=2 Step 950 | Loss: 128.81312561035156
- </span>
变分自编码器参考资料:
1.变分自编码器(Variational Autoencoder, VAE)通俗教程 – 邓范鑫——致力于变革未来的智能技术 http://www.dengfanxin.cn/?p=334
2.VAE variation inference变分推理 清爽介绍 http://mp.weixin.qq.com/s/9lNWkEEOk5vEkJ1f840zxA
3.深度学习变分贝叶斯自编码器(上下) https://zhuanlan.zhihu.com/p/25429082
变分自编码(VAE)及代码解读相关推荐
- 单指标时间序列异常检测——基于重构概率的变分自编码(VAE)代码实现(详细解释)
1. 编写目的 不少论文都是基于VAE完成的异常检测,比如 Donut .Bagel.尽管 Donut 实现的模型很容易通过继承于重写父类方法的方式实现一个 VAE-baseline,并且 Bagel ...
- 变分自编码器VAE ——公式推导(含实现代码)
目录 一.什么是变分自编码器 二.VAE的公式推导 三.重参数化技巧 一.什么是变分自编码器 在讲述VAE(variational auto-encoder)之前,有必要先看一下AE(auto- ...
- 变分自编码器VAE:一步到位的聚类方案
作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 由于 VAE 中既有编码器又有解码器(生成器),同时隐变量分布又被近似编码为标准正态分布,因此 V ...
- VGAE(Variational graph auto-encoders)论文及代码解读
一,论文来源 论文pdf Variational graph auto-encoders 论文代码 github代码 二,论文解读 理论部分参考: Variational Graph Auto-Enc ...
- 变分自编码器VAE:这样做为什么能成?
作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 话说我觉得我自己最近写文章都喜欢长篇大论了,而且扎堆地来.之前连续写了三篇关于 Capsule 的 ...
- 【Pytorch神经网络实战案例】14 构建条件变分自编码神经网络模型生成可控Fashon-MNST模拟数据
1 条件变分自编码神经网络生成模拟数据案例说明 在实际应用中,条件变分自编码神经网络的应用会更为广泛一些,因为它使得模型输出的模拟数据可控,即可以指定模型输出鞋子或者上衣. 1.1 案例描述 在变分自 ...
- 【Pytorch神经网络实战案例】13 构建变分自编码神经网络模型生成Fashon-MNST模拟数据
1 变分自编码神经网络生成模拟数据案例说明 变分自编码里面真正的公式只有一个KL散度. 1.1 变分自编码神经网络模型介绍 主要由以下三个部分构成: 1.1.1 编码器 由两层全连接神经网络组成,第一 ...
- 【神经网络】变分自编码大杂烩
1.变分自编码 变分是数学上的概念,大致含义是寻求一个中间的函数,通过改变中间函数来查看目标函数的改变.变分推断是变分自编码的核心,那么变分推断是要解决的是什么问题?? 问题描述如下,假如我们有一批样 ...
- 4.keras实现--生成式深度学习之用变分自编码器VAE生成图像(mnist数据集和名人头像数据集)...
1.VAE和GAN 变分自编码器(VAE,variatinal autoencoder) VS 生成式对抗网络(GAN,generative adversarial network) 两者不 ...
- BERT:代码解读、实体关系抽取实战
目录 前言 一.BERT的主要亮点 1. 双向Transformers 2.句子级别的应用 3.能够解决的任务 二.BERT代码解读 1. 数据预处理 1.1 InputExample类 1.2 In ...
最新文章
- JAVA如何检测GC日志
- ThreadLocal使用
- ECCV 2020《Linguistic Structure Guided Context Modeling for Referring Image Segmentation》论文笔记
- 面试突击 | Redis 如何从海量数据中查询出某一个 Key?视频版
- 如何在Jupyter中运行R语言(两种解决方案)
- python如何搭建环境_Python基础环境如何搭建
- RabbitMQ中basicConsume、basicCancel、basicPublish方法
- 斐波那契数列-爬楼梯算法
- 算法笔记_面试题_11.正则表达式匹配
- GIS案例练习-----------第九天
- 2021-06-21>字体样式风格font
- 计算机考研初试/复试——软件工程
- 【opencv】 报错:C2065 “CV_COVAR_ROWS”、“CV_COVAR_NORMAL”、“CV_COVAR_SCALE”: 未声明的标识符、
- QQ免费企业邮箱申请配置
- 原生代码开发小米官网首页
- shiro集成jwt
- student dictionary
- 高可用架构:异地多活
- mysqld --defaults-file=/myfolder/my.cnf --defaults-extra-file=/myfolder2/my.cnf
- ubuntu kylin 分辨率不对
热门文章
- 大神论坛 利用活跃变量分析来去掉vmp的大部分垃圾指令
- Android SDK ADB命令行总结
- Oracle的Replace函数与translate函数详解与比较
- operator的理解
- 【CSS3学习笔记】16:边框图片效果
- 计算机绘画小房子教案,小班美术教案小房子
- google工具栏新览
- unity二維碼生成(新)
- jink下载出现:Failed to download RAMCode . Failed to prepare for programming .
- 潇潇六月雨 input file里的JQ change() 事件的只生效一次