【发布时间】:2020-02-20 19:49:56
【问题描述】:
我读过 Keras 的 this blog 关于 VAE 实现的内容,其中 VAE 损失是这样定义的:
def vae_loss(x, x_decoded_mean):
xent_loss = objectives.binary_crossentropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
return xent_loss + kl_loss
我查看了Keras documentation,VAE 损失函数是这样定义的: 在这个实现中,reconstruction_loss 乘以 original_dim,我在第一个实现中没有看到!
if args.mse:
reconstruction_loss = mse(inputs, outputs)
else:
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)
有人能解释一下为什么吗?谢谢!
【问题讨论】:
-
仍然不知道为什么,但在我的测试中,我确实必须增加很多重建损失才能训练,否则 KL 太大而赢得比赛。也许这个原始的暗淡是选择增加多少重建损失的关键......必须花一点数学时间来检查这是否属实。
-
通过增加重建损失,你的意思是你将它乘以大于一的数字?
-
对于我的数据,我的潜在空间的结构和聚类都很好,但重建的输入与输入有一些主要差异。也许像你这样的事情也发生在我身上!
标签: python keras autoencoder loss-function