keras变分自动编码器损失函数
keras variational 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)
有人可以解释一下为什么吗?谢谢!
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
请注意,第二个 returns 是所有样本的平均损失,但第一个 returns 是所有样本的损失向量。
在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 = width × height × channels = 28 × 28 × 1 = 784
因此,
reconstruction_loss = mse(inputs, outputs)
应该乘以m(即原始维度)等于VAE公式中的原始重建损失。
我读过 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)
有人可以解释一下为什么吗?谢谢!
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
请注意,第二个 returns 是所有样本的平均损失,但第一个 returns 是所有样本的损失向量。
在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 = width × height × channels = 28 × 28 × 1 = 784
因此,
reconstruction_loss = mse(inputs, outputs)
应该乘以m(即原始维度)等于VAE公式中的原始重建损失。