我需要在Tensorflow中实现一个高斯对数似然损失函数,但是我不确定我写的是否正确。我认为这是损失函数的正确定义。
我像这样实现它:
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 值。
将标准开发建模为日志标准开发,这应该可以解决 nan 问题。因此,与其假装 stddev 是 sigma^2,不如假装它是 sigma^2 的自然对数。