tensorflow1.1/variational_autoencoder

2024-03-07 14:32

本文主要是介绍tensorflow1.1/variational_autoencoder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境tensorflow1.1,matplotlib2.02,python3

近年,非监督学习成为了研究热点。VAE(Variational Auto-Encoder,变分自编码器)和 GAN(Generative Adversarial Networks) 等模型,受到越来越多的关注

VAE:模型结构:
这里写图片描述

其中:loss = mse+KLDivergence

#coding:utf-8
"""
tensorflow 1.1
matplotlib 2.02
"""
import tensorflow as tf
import numpy as np
import input_data
import matplotlib.pyplot as pltinput_dim = 784
hidden_encoder_dim = 1200
hidden_decoder_dim = 1200
latent_dim = 200
epochs = 3000
batch_size = 100
N_pictures=3mnist = input_data.read_data_sets('mnist/')def weight_variable(shape):#tf.truncated_normal()截断的标准正态分布return tf.Variable(tf.truncated_normal(shape,stddev=0.001))def bias_variable(shape):return tf.Variable(tf.truncated_normal(shape))x = tf.placeholder('float32',[None,input_dim])
#在全连接层加入l2_regularization
l2_loss = tf.constant(0.0)#encoder网络
w_encoder1 =weight_variable([input_dim,hidden_encoder_dim])
b_encoder1 = bias_variable([hidden_encoder_dim])
encoder1 = tf.nn.relu(tf.matmul(x,w_encoder1)+b_encoder1)
#第一层的l2_loss
l2_loss += tf.nn.l2_loss(w_encoder1)#定义一个mu网络
mu_w_encoder2 = weight_variable([hidden_encoder_dim,latent_dim])
mu_b_encoder2 = bias_variable([latent_dim])
mu_encoder2 = tf.matmul(encoder1,mu_w_encoder2)+mu_b_encoder2
#mu网络的l2_loss
l2_loss += tf.nn.l2_loss(mu_w_encoder2)#定义一个var网络
var_w_encoder2 = weight_variable([hidden_encoder_dim,latent_dim])
var_b_encoder2 = bias_variable([latent_dim])
var_encoder2 = tf.matmul(encoder1,var_w_encoder2)+var_b_encoder2
#var网络的l2_loss
l2_loss += tf.nn.l2_loss(var_w_encoder2)#抽样
#生成标准正态分布
epsilon = tf.random_normal(tf.shape(var_encoder2))
new_var_encoder2 = tf.sqrt(tf.exp(var_encoder2))
#z的维度是latent_dim
z = mu_encoder2+tf.multiply(new_var_encoder2,epsilon)#定义decoder网络
w_decoder1 = weight_variable([latent_dim,hidden_decoder_dim])
b_decoder1 = bias_variable([hidden_decoder_dim])
decoder1 = tf.nn.relu(tf.matmul(z,w_decoder1)+b_decoder1)
l2_loss += tf.nn.l2_loss(w_decoder1)
w_decoder2 = weight_variable([hidden_decoder_dim,input_dim])
b_decoder2 = bias_variable([input_dim])
#输出层没有使用激活函数(加入激活函数后面用log_px_given_z,不加入激活函数用cost1)
decoder2 = tf.nn.sigmoid(tf.matmul(decoder1,w_decoder2)+b_decoder2)
l2_loss += tf.nn.l2_loss(w_decoder2)#计算cost
log_px_given_z = -tf.reduce_sum(x*tf.log(decoder2+1e-10)+(1-x)*tf.log(1-decoder2+1e-10),1)
#cost1 = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=decoder2,labels=x),reduction_indices=1)
#计算KL Divergence
KLD = -0.5*tf.reduce_sum(1+var_encoder2-tf.pow(mu_encoder2,2)-tf.exp(var_encoder2),reduction_indices=1)
cost = tf.reduce_mean(log_px_given_z+KLD)
#加上regularization 
regularized_cost = cost + l2_losstrain = tf.train.AdamOptimizer(0.01).minimize(cost)with tf.Session() as sess:init = tf.global_variables_initializer()sess.run(init)#画图,2行5列返回图和子图figure_,a = plt.subplots(2,N_pictures,figsize=(6,4))#开始交互模式plt.ion()#测试的图view_figures = mnist.test.images[:N_pictures]for i in range(N_pictures):#将图片reshape为28行28列显示a[0][i].imshow(np.reshape(view_figures[i],(28,28)))#清空x轴,y轴坐标a[0][i].set_xticks(())a[0][i].set_yticks(())for step in range(10000):batch_x,batch_y = mnist.train.next_batch(batch_size)#encoder3和decoder3需要进行run_,encoded,decoded,c = sess.run([train,z,decoder2,cost],feed_dict={x:batch_x})if step % 1000 ==0:print('= = = = = = > > > > > >','train loss:% .4f' % c)#将真实的图片和autoencoder后的图片对比decoder_figures = sess.run(decoder2,feed_dict={x:view_figures})for i in range(N_pictures):#清除第一行图片a[1][i].clear()a[1][i].imshow(np.reshape(decoder_figures[i],(28,28)))a[1][i].set_xticks(())a[1][i].set_yticks(())plt.draw()plt.pause(1)plt.ioff() #关闭交互模式"""
with tf.Session() as sess:init = tf.global_variables_initializer()sess.run(init)for epoch in range(epochs):batch_x,batch_y = mnist.train.next_batch(batch_size)_,c = sess.run([train,cost],feed_dict={x:batch_x})if epoch % 100 == 0:print('- - - - - - > > > > > > epoch: ',int(epoch/100),'cost: %.4f' %c)#输出结果可视化encoder_result = sess.run(z,feed_dict={x:mnist.test.images})plt.scatter(encoder_result[:,0],encoder_result[:,1],c = mnist.test.labels,label='mnist distributions')plt.legend(loc='best')plt.title('different mnist digits shows in figure')plt.colorbar()plt.show()"""

结果

这里写图片描述

这里写图片描述

聚类效果:
这里写图片描述

这篇关于tensorflow1.1/variational_autoencoder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783828

相关文章

Autoencoder(AE)、Variational Autoencoder(VAE)和Diffusion Models(DM)了解

Autoencoder (AE) 工作原理: Autoencoder就像一个数据压缩机器。它由两部分组成: 编码器:将输入数据压缩成一个小小的代码。解码器:将这个小代码还原成尽可能接近原始输入的数据。 优点和应用: 简单易懂:用于学习数据的特征和去除噪声。应用场景:例如可以用来缩小图像的大小但保留关键特征,或者去除文本数据中的错误。 挑战: 数据损坏:如果输入数据太乱,编码器可能无法有

Autoencorder理解(5):VAE(Variational Auto-Encoder,变分自编码器)

reference: http://blog.csdn.net/jackytintin/article/details/53641885 近年,随着有监督学习的低枝果实被采摘的所剩无几,无监督学习成为了研究热点。VAE(Variational Auto-Encoder,变分自编码器)[1,2] 和 GAN(Generative Adversarial Networks) 等模型,受到越来越多的关

Autoencorder理解(7):Variational Autoencoder

以下将分为6个部分介绍: vae结构框架vae与ae区别提及一下为什么要采样如何优化vae应用vae生成/抽象看待vae学习 1.框架: 先来看一下VAE的结构框架,并先预告一下结论: VAE 包括 encoder (模块 1)和 decoder(模块 4) 两个神经网络。两者通过模块 2、3 连接成一个大网络。利益于 reparemeterization 技巧,我们可以使用常规

自编码器(AutoEncoder)入门及TensorFlow实现

自编码器(Autoencoder,AE),是一种利用反向传播算法使得输出值等于输入值的神经网络,它先将输入压缩成潜在空间表征,然后通过这种表征来重构输出。 自编码器由两部分组成: 编码器(encoder):这部分能将输入压缩成潜在空间表征,可以用编码函数h=f(x)表示。 解码器(decoder):这部分重构来自潜在空间表征的输入,可以用解码函数r=g(h)表示。 因此,整个自编码器可以用

变分自编码器(Variational Autoencoder, VAE)

目录 why VAE: 关于变分自编码器,这篇文章讲的不错 1. 自编码器(Autoencoder)的基础 2. 引入概率图模型 3. 重参数化技巧 4. 损失函数 5. 应用 变分自编码器(Variational Autoencoder, VAE) why VAE: 关于变分自编码器,这篇文章讲的不错 机器学习方法—优雅的模型(一):变分自编码器(VAE

深度学习之autoEncoder

1)autoencoder autoencoder是一种无监督的学习算法,他利用反向传播算法,让目标值等于输入值。如图所示: Autoencoder尝试学习一个  的函数。也就是说autoencoder尝试逼近一个恒等函数,使得输出接近于输入 。当然为了使这个函数有意义,需要加入一些限制条件(比如说限制隐藏神经元的数目),就可以发现一些有意义的结构。Autoencoder可

Tensorflow - Tutorial (5) : 降噪自动编码器(Denoising Autoencoder)

1. Denoising Autoencoder 在神经网络模型训练阶段开始前,通过Autoencoder对模型进行预训练可确定编码器 W W的初始参数值。然而,受模型复杂度、训练集数据量以及数据噪音等问题的影响,通过Autoencoder得到的初始模型往往存在过拟合的风险。关于Autoencoder的介绍请参考:自动编码器(Autoencoder)。在介绍Denoising Autoencod

自动编码器(Autoencoder)

Autoencoder autoencoder是一种无监督的学习算法,主要用于数据的降维或者特征的抽取,在深度学习中,autoencoder可用于在训练阶段开始前,确定权重矩阵 W W的初始值。神经网络中的权重矩阵WW可看作是对输入的数据进行特征转换,即先将数据编码为另一种形式,然后在此基础上进行一系列学习。然而,在对权重初始化时,我们并不知道初始的权重值在训练时会起到怎样的作用,也不知道在训练

AutoEncoder、RBM、DBM、DBN初探

转自牛人博客:http://blog.csdn.net/zouxy09/article/details/8775524 AutoEncoder自动编码器         Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重。自然地,我

【神经网络】AutoEncoder自编码器

1.基本功能 \qquad自编码器最大的特点是输入与输出的节点数是一致的,其功能并不是进行分类或者是回归预测,而是将原始数据转换为一种特殊的特征表示方式,在训练的过程中,依然采用反向传播算法进行参数优化,目标函数为使输出与输入之间的误差最小化。 \qquad基本功能如图,如图所示,普通神经网络是训练类别(或者离散值)与输入之间的映射关系,而AutoEncoder是将input通过e