当不使用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是含有方差的对数的矢量。
这是怎么回事错在这里?提前致谢 :)
一个可能的原因是在两个损失之间的数值不平衡,同而BCE
一个求和您size_average=True
损失计算为平均比批次(C.F. KLD
)。
是的,尝试与该KLD损失项不同的权重因子。称重下来KLD损失项可解决CelebA数据集(http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)相同的重建输出的问题。
乘法KLD 0.0001做到了。生成的图像是有点扭曲,但相似的问题解决了。