- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基于this example在 keras 中,我构建了一个自动编码器并在 MNIST 数据集上对其进行训练,但根据我如何重建输入,输出会有所不同。
第 1 行 = 原始 MNIST test_data
第 2 行 = 解码器(编码器(test_data))
第 3 行 = full_vae_model(test_data)
如果仔细观察,您会发现第 2 行和第 3 行中的数字看起来不同。有人可以解释为什么会这样吗?根据我的理解,通过两条路径中的哪一条重建原始数据应该没有任何区别。
这是变分自动编码器的结构(图像取自 this article )。现在,当我获取输入并将其传递到整个网络时,为什么它与将其传递到潜在向量,然后再次将中间结果传递到输出不同?其间会发生什么?
这是代码,对 keras example 稍加修改(但架构没有发生任何变化)
'''Example of VAE on MNIST dataset using MLP
The VAE has a modular design. The encoder, decoder and VAE
are 3 models that share weights. After training the VAE model,
the encoder can be used to generate latent vectors.
The decoder can be used to generate MNIST digits by sampling the
latent vector from a Gaussian distribution with mean=0 and std=1.
# Reference
[1] Kingma, Diederik P., and Max Welling.
"Auto-encoding variational bayes."
https://arxiv.org/abs/1312.6114
'''
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from keras.layers import Lambda, Input, Dense
from keras.models import Model
from keras.datasets import mnist
from keras.losses import mse, binary_crossentropy
from keras.utils import plot_model
from keras import backend as K
import numpy as np
import matplotlib.pyplot as plt
import os
# reparameterization trick
# instead of sampling from Q(z|X), sample eps = N(0,I)
# z = z_mean + sqrt(var)*eps
def sampling(args):
"""Reparameterization trick by sampling fr an isotropic unit Gaussian.
# Arguments:
args (tensor): mean and log of variance of Q(z|X)
# Returns:
z (tensor): sampled latent vector
"""
z_mean, z_log_var = args
batch = K.shape(z_mean)[0]
dim = K.int_shape(z_mean)[1]
# by default, random_normal has mean=0 and std=1.0
epsilon = K.random_normal(shape=(batch, dim))
return z_mean + K.exp(0.5 * z_log_var) * epsilon
# MNIST dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()
image_size = x_train.shape[1]
original_dim = image_size * image_size
x_train = np.reshape(x_train, [-1, original_dim])
x_test = np.reshape(x_test, [-1, original_dim])
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
# network parameters
input_shape = (original_dim, )
intermediate_dim = 512
batch_size = 128
latent_dim = 32
epochs = 50
# VAE model = encoder + decoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
x = Dense(intermediate_dim, activation='relu')(inputs)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)
# use reparameterization trick to push the sampling out as input
# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])
# instantiate encoder model
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')
encoder.summary()
#plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True)
# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
x = Dense(intermediate_dim, activation='relu')(latent_inputs)
outputs = Dense(original_dim, activation='sigmoid')(x)
# instantiate decoder model
decoder = Model(latent_inputs, outputs, name='decoder')
decoder.summary()
#plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True)
# instantiate VAE model
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs, name='vae_mlp')
if __name__ == '__main__':
models = (encoder, decoder)
data = (x_test, y_test)
# VAE loss = mse_loss or xent_loss + kl_loss
#reconstruction_loss = mse(inputs, outputs)
reconstruction_loss = binary_crossentropy(inputs, outputs)
reconstruction_loss *= original_dim
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.sum(kl_loss, axis=-1)
kl_loss *= -0.5
vae_loss = K.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer='adam')
vae.summary()
# train the autoencoder
vae.fit(x_train,
epochs=epochs,
batch_size=batch_size,
validation_data=(x_test, None))
#vae.save_weights('vae_mlp_mnist.h5')
z_mean, z_log_var, z = encoder.predict(x_test)
decoded_imgs = decoder.predict(z_mean)
Y_img = vae.predict(x_test)
n = 10 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
# display original
ax = plt.subplot(3, n, i + 1)
plt.imshow(x_test[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# display reconstruction
ax = plt.subplot(3, n, i + 1 + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# display reconstruction 2
ax = plt.subplot(3, n, i + 1 + 2 * n)
plt.imshow(Y_img[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
最佳答案
我认为,如果您使用相同的 test_data
运行 decoder(encoder(test_data))
两次,您应该得到不同的输出,这是正确的行为。
如果您可以引用“变分自动编码器教程”,请参见图 4(右),它是关于“作为前馈神经网络实现的训练时间变分自动编码器”。它从正态分布中采样 epsilon,因此 epsilon 是一个随机变量,每当您在代码中调用该函数时,它的实现都是不同的。
关于python - 变分自动编码器 (VAE) 显示不一致的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50626288/
我正在为 MNIST 数据集在 Tensorflow 中试验 VAE 实现。首先,我训练了一个基于 MLP 编码器和解码器的 VAE。它训练得很好,损失减少了,并且生成了看似合理的数字。下面是这个基于
我正在构建一个加载巨大数据集的 VAE。输入数据是维度为 (batch_size, 48, 48, 48) 的 3D 二进制体素数据。为了在训练中一个一个地加载数据,我构建了一个生成器,如下所示 cl
我正在尝试构建一个 2 阶段 VQ-VAE-2 + PixelCNN,如论文中所示:“使用 VQ-VAE-2 生成多样化的高保真图像”(https://arxiv.org/pdf/1906.00446
我正在尝试构建一个 2 阶段 VQ-VAE-2 + PixelCNN,如论文中所示:“使用 VQ-VAE-2 生成多样化的高保真图像”(https://arxiv.org/pdf/1906.00446
我是机器学习新手,正在使用以下代码在 MNISET 数据集上创建示例 VAE # We are going to use MINISET Dataset to train our GAN. # All
基于this example在 keras 中,我构建了一个自动编码器并在 MNIST 数据集上对其进行训练,但根据我如何重建输入,输出会有所不同。 第 1 行 = 原始 MNIST test_dat
我正在尝试使用 Keras 为 LSTM-VAE 建模以进行时间序列重建。 我曾经提到过https://github.com/twairball/keras_lstm_vae/blob/master/
它似乎不是 https://en.wikipedia.org/wiki/Log-normal_distribution 中所见的常规日志规范 pdf https://www.tensorflow.or
我正在使用 Chainer 框架在 Python 中构建变分自动编码器 (VAE) (link) 。我在 github 上找到了各种工作示例,并正在尝试改编其中之一。我已经成功地让它运行并且工作得很好
我正在学习tutorial这里。我的模型部分是: input_img = keras.Input(shape=img_shape) x = layers.Conv2D(32, (3, 3),
因此,您可以将随机输入 (z) 提供给神经网络并使输出随机,但这只是 f(p(z)),其中 f(.) 是确定性神经网络,因此它将充当转换为更复杂的分布。 引入随机性的另一种方法是将 NN 输出视为特定
我是一名优秀的程序员,十分优秀!