python - 变分自动编码器损失函数(keras)

标签 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

我想我会以几乎线性的方式从蓝色变为红色。相反,我以困惑的方式获得了所有数据的集群。

你们能帮帮我吗?谢谢!

最佳答案

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

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

相关文章:

python - 深度python字典递归

python-3.x - ffmpeg 将一张图片转换为视频

python-3.x - 修补 boto3.resource 和 resource.Table 方法进行单元测试

python - 在神经网络中准备训练和验证数据时出错

python - 是否可以将tensorflow代码转换为theano代码?

tensorflow - Keras Multi GPU 示例给出 ResourceExhaustedError

python - 在 QGraphicsGridLayout 中调整小部件大小

python - PySpark:如何按固定日期范围和使用窗口函数计算值列总和的另一列进行分组?

python - 如何使图像看起来更均匀而不丢失精细细节

Python - 如何更简洁地使用生成器?