变分自动编码器丢失功能(keras)

时间:2017-09-22 13:11:28

标签: python python-3.x keras autoencoder loss-function

我正在使用Keras构建变分自动编码器。我很大程度上受到@Fchollet示例的启发:https://github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py

但我正在使用连续数据。我的输出是一个持续时间,而不是像在MNIST中那样对数字进行排名。在这方面,我将损失函数从binary_crossentropy更改为mean_squared_error。我主要想知道第二个任期,即KL的分歧。是否应该与连续数据一起使用?我无法绕过它。对我而言,它应该将类似的数据紧密地放在潜在的空间中。例如,在MNIST数据的cas中,将每个" 1"在潜在的空间里,每一个" 2"在一起等...由于我正在使用连续数据,它是如何工作的?在我的案例中是否有更好的丢失功能?

这是失去的功能:

def vae_loss(x, x_decoded_mean):
    xent_loss = original_dim *metrics.mean_squared_error(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 K.mean(xent_loss + kl_loss)
vae.compile(optimizer='Adam', loss=vae_loss)

这里是3D潜在空间中的一种表现形式。 enter image description here

如您所见,根据需要将一些类似的数据放在一起。这是当我将kl_loss函数的系数增加到" -100000"而不是" -0.5" : enter image description here

我以为我会以几乎线性的方式从蓝色到红色。相反,我以混乱的方式得到了所有数据的集群。

你能帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

在我看来,这是因为你通过增加其系数来增加KL损失的重要性。换句话说,损失函数“照顾”KL术语更多。请记住,KL损失用于使用先前的N(0,1)来“获取”后验分布。所以,如果你'大量'扩展'这种行为(系数很大),每个数据的分布都会收敛到这个分布==>所有数据的后跟均值为0&数据一起推向0 ==>你的潜在代表:)