变分自动编码器在使用 KL 散度时为每个输入 mnist 图像提供相同的输出图像
Variational Autoencoder gives same output image for every input mnist image when using KL divergence
当不使用 KL 散度项时,VAE 几乎可以完美地重建 mnist 图像,但在提供随机噪声时无法正确生成新图像。
当使用 KL 散度项时,VAE 在重建和生成图像时给出相同的奇怪输出。
这是损失函数的pytorch代码:
def loss_function(recon_x, x, mu, logvar):
BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), size_average=True)
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return (BCE+KLD)
recon_x 是重建图像,x 是 original_image,mu 是均值向量,而 logvar 是包含方差对数的向量。
这里出了什么问题?提前致谢:)
将 KLD 乘以 0.0001 即可。生成的图像有点失真,但相似性问题已解决。
一个可能的原因是两次损失之间的数值不平衡,您的 BCE
损失计算为批次 (c.f. size_average=True
) 的平均值,而 KLD
一个是相加的。
是的,尝试对 KLD 损失项使用不同的权重因子。权衡 KLD 损失项解决了 CelebA 数据集中相同的重建输出问题 (http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)。
当不使用 KL 散度项时,VAE 几乎可以完美地重建 mnist 图像,但在提供随机噪声时无法正确生成新图像。
当使用 KL 散度项时,VAE 在重建和生成图像时给出相同的奇怪输出。
这是损失函数的pytorch代码:
def loss_function(recon_x, x, mu, logvar):
BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), size_average=True)
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return (BCE+KLD)
recon_x 是重建图像,x 是 original_image,mu 是均值向量,而 logvar 是包含方差对数的向量。
这里出了什么问题?提前致谢:)
将 KLD 乘以 0.0001 即可。生成的图像有点失真,但相似性问题已解决。
一个可能的原因是两次损失之间的数值不平衡,您的 BCE
损失计算为批次 (c.f. size_average=True
) 的平均值,而 KLD
一个是相加的。
是的,尝试对 KLD 损失项使用不同的权重因子。权衡 KLD 损失项解决了 CelebA 数据集中相同的重建输出问题 (http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)。