我正在使用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潜在空间中的表示。
python - 可变自动编码器丢失功能(keras)-LMLPHP

如您所见,一些相似的数据已根据需要组合在一起。当我将kl_loss函数的系数增加到“-100000”而不是“-0.5”时,会发生以下情况:
python - 可变自动编码器丢失功能(keras)-LMLPHP

我以为我会以一种几乎线性的方式从蓝色变成红色。相反,我以困惑的方式得到了所有数据的簇。

你们能帮帮我吗?谢谢 !

最佳答案

我认为这是因为您通过增加其系数来增加了KL损失的重要性。换句话说,损失函数“照顾” KL术语更多。请记住,KL损失用于通过先验N(0,1)来“获取”后验分布。因此,如果您大量扩展此行为(系数较大),则每个数据的分布将朝该分布收敛==>所有数据的后验均值为0,数据推向0 ==>您的潜在表示形式:)

关于python - 可变自动编码器丢失功能(keras),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46365652/

10-11 18:03