keras变分自动编码器损失函数

时间:2020-02-20 19:49:56

标签: python keras autoencoder loss-function

我已经阅读了Keras撰写的关于VAE实施的this blog,其中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)

有人可以解释为什么吗?谢谢!

2 个答案:

答案 0 :(得分:2)

first_one:CE + mean(kl, axis=-1) = CE + sum(kl, axis=-1) / d

second_one:d * CE + sum(kl, axis=-1)

所以: first_one = second_one / d

请注意,第二个返回所有样本的平均损失,但是第一个返回所有样本的损失向量。

答案 1 :(得分:1)

在VAE中,重建损失函数可以表示为:

reconstruction_loss = - log(p ( x | z))

如果假定解码器的输出分布为高斯分布,则损耗函数归结为MSE,因为:

reconstruction_loss = - log(p( x | z)) = - log ∏ ( N(x(i), x_out(i), sigma**2) = − ∑ log ( N(x(i), x_out(i), sigma**2) . alpha . ∑ (x(i), x_out(i))**2

相比之下,MSE损失的等式为:

L(x,x_out) = MSE = 1/m ∑ (x(i) - x_out(i)) **2

其中m是输出尺寸。例如,在MNIST中,m =宽×高×通道= 28×28×1 = 784

因此

reconstruction_loss = mse(inputs, outputs)

应乘以m(即原始尺寸)等于VAE公式中的原始重建损失。