Tensorflow中的高斯Log可能性损失函数

时间:2017-06-15 13:34:09

标签: tensorflow gaussian autoencoder loss

我需要在Tensorflow中实现高斯对数似然丢失函数,但是我不确定我写的是否正确。我认为this是损失函数的正确定义。

我像这样实施它:

    two_pi = 2*np.pi

    def gaussian_density_function(x, mean, stddev):

        stddev2 = tf.pow(stddev, 2)
        z = tf.multiply(two_pi, stddev2)
        z = tf.pow(z, 0.5)

        arg = -0.5*(x-mean)
        arg = tf.pow(arg, 2)
        arg = tf.div(arg, stddev2)

        return tf.divide(tf.exp(arg), z)


    mean_x, var_x = tf.nn.moments(dae_output_tensor, [0])
    stddev_x = tf.sqrt(var_x)

    loss_op_AE = -gaussian_density_function(inputs, mean_x, stddev_x)
    loss_op_AE = tf.reduce_mean(loss_op_AE)

我想将它用作自动编码器的丢失函数,但是,我不确定这个实现是否正确,因为我从loss_op_AE中获得了NaN。

编辑:我也尝试过使用:

    mean_x, var_x = tf.nn.moments(autoencoder_output, axes=[1,2])
    stddev_x = tf.sqrt(var_x)

    dist = tf.contrib.distributions.Normal(mean_x, stddev_x)
    loss_op_AE = -dist.pdf(inputs)

我获得了相同的NaN值。

1 个答案:

答案 0 :(得分:1)

将stddev建模为log stddev,这应解决nan问题。所以不是假装stddev是sigma ^ 2,而是假装它是sigma ^ 2的自然对数。