VAE新解(下)

12 篇文章 0 订阅

1,框架构建

还记得上篇提到的隐含变量Z吗?这个Z就是决定最终x形态的隐含变量。给定一个图片Xk,我们假定P(Z|Xk)代表这些图片的概率分布,并且服从正态分布。然后我们从中采样(重参数见2),并且通过decoder将图片再恢复出来。
简而言之,就是encoder,对相应的输入数据,通过网络(两个dense层)产生了均值和方差。为了避免var为0(因为引入噪声数据),使模型具有持续的生成能力,VAE 要求每个P(Z|Xk)都向正态分布看齐。
而decoder,则负责对获得的Z解码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2,重参数技巧

在实际应用过程中,z的值是一个随机变量,反向传播中,我们没有办法对z求导。我们通常用reparametrization trick代替randomly sample,即通过引入一个高斯分布e,将z变成一个确定的值,从而使得反向传播可以得以计算。
在这里插入图片描述

3,loss

1,分类损失
2,分布损失

最终loss

 xent_loss = K.sum(K.binary_crossentropy(x, x_decoded_mean), axis=-1)
 kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
 vae_loss = K.mean(xent_loss + kl_loss)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我可以回答这个问题。以下是Python用vae实现解纠缠得到数据的均值向量的代码: ```python import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # Define the encoder network latent_dim = 2 encoder_inputs = keras.Input(shape=(28, 28, 1)) x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(encoder_inputs) x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x) x = layers.Flatten()(x) x = layers.Dense(16, activation="relu")(x) z_mean = layers.Dense(latent_dim, name="z_mean")(x) z_log_var = layers.Dense(latent_dim, name="z_log_var")(x) encoder = keras.Model(encoder_inputs, [z_mean, z_log_var], name="encoder") # Define the decoder network latent_inputs = keras.Input(shape=(latent_dim,)) x = layers.Dense(7 * 7 * 64, activation="relu")(latent_inputs) x = layers.Reshape((7, 7, 64))(x) x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(x) x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x) decoder_outputs = layers.Conv2DTranspose(1, 3, activation="sigmoid", padding="same")(x) decoder = keras.Model(latent_inputs, decoder_outputs, name="decoder") # Define the VAE as a Model with a custom train_step class VAE(keras.Model): def __init__(self, encoder, decoder, **kwargs): super(VAE, self).__init__(**kwargs) self.encoder = encoder self.decoder = decoder def train_step(self, data): if isinstance(data, tuple): data = data[0] with tf.GradientTape() as tape: z_mean, z_log_var = self.encoder(data) z = self.sampling((z_mean, z_log_var)) reconstruction = self.decoder(z) reconstruction_loss = tf.reduce_mean( keras.losses.binary_crossentropy(data, reconstruction) ) reconstruction_loss *= 28 * 28 kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var) kl_loss = tf.reduce_mean(kl_loss) kl_loss *= -0.5 total_loss = reconstruction_loss + kl_loss grads = tape.gradient(total_loss, self.trainable_weights) self.optimizer.apply_gradients(zip(grads, self.trainable_weights)) return { "loss": total_loss, "reconstruction_loss": reconstruction_loss, "kl_loss": kl_loss, } def sampling(self, args): z_mean, z_log_var = args batch_size = tf.shape(z_mean)[0] epsilon = tf.keras.backend.random_normal(shape=(batch_size, latent_dim)) return z_mean + tf.exp(0.5 * z_log_var) * epsilon # Train the VAE on MNIST digits (x_train, _), (x_test, _) = keras.datasets.mnist.load_data() mnist_digits = np.concatenate([x_train, x_test], axis=0) mnist_digits = np.expand_dims(mnist_digits, -1).astype("float32") / 255 vae = VAE(encoder, decoder) vae.compile(optimizer=keras.optimizers.Adam()) vae.fit(mnist_digits, epochs=30, batch_size=128) ``` 希望这个代码能够帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值