VAE的重建损失函数
我正在从TensorFlow文档给出的一个示例中学习,:
vaes训练通过最大化证据下限(ELBO) 边缘模可能性。
实际上,优化了单个样本蒙特卡洛估计值 期望:logp(x | z) + logp(z) - logq(z | x)。
损失函数的实现为:
def log_normal_pdf(sample, mean, logvar, raxis=1):
log2pi = tf.math.log(2. * np.pi)
return tf.reduce_sum(
-.5 * ((sample - mean) ** 2. * tf.exp(-logvar) + logvar + log2pi),
axis=raxis)
def compute_loss(model, x):
mean, logvar = model.encode(x)
z = model.reparameterize(mean, logvar)
x_logit = model.decode(z)
cross_ent = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_logit, labels=x)
logpx_z = -tf.reduce_sum(cross_ent, axis=[1, 2, 3])
logpz = log_normal_pdf(z, 0., 0.)
logqz_x = log_normal_pdf(z, mean, logvar)
return -tf.reduce_mean(logpx_z + logpz - logqz_x)
由于此示例使用了算机数据集,因此 x
可以标准化为[0,1], sigmoid_cross_entropy_with_logits
在此处使用。
我的问题是:
- 如果
x> 1
,可以使用什么样的损失? - 我们可以将其他损失函数用作VAE的重建损失,例如Huber损失( https:// en。 wikipedia.org/wiki/huber_loss )?
- 使用MSE损失的另一个示例(如下),MSE损失是否有效
Elbo
对p(x | z)的损失?
https:> putting_it_all_together_an_end-to-end_example
# Iterate over the batches of the dataset.
for step, x_batch_train in enumerate(train_dataset):
with tf.GradientTape() as tape:
reconstructed = vae(x_batch_train)
# Compute reconstruction loss
loss = mse_loss_fn(x_batch_train, reconstructed)
loss += sum(vae.losses) # Add KLD regularization loss
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在变量自动编码器的损耗函数中,您可以共同优化两个术语:
重建损失部分的kullback-leibler差异来衡量的,您可以选择适合您数据的任何损耗函数,包括MSE和Huber。不过,通常将输入功能归一化仍然是一个好主意。
In the loss function of a variational autoencoder, you jointly optimize two terms:
For the reconstruction loss part, you can pick any loss function that fits your data, including MSE and Huber. It is generally still a good idea to normalize your input features though.