2

我正在使用 tensorflow 分发 API 进行采样,以下是我正在使用的示例代码,但我发现概率大于 1,然后对数概率小于 0。我尝试了 CPU 和 GPU,都产生了这个奇怪的结果。张量流是1.3。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
from sklearn.datasets import load_boston
from sklearn.preprocessing import scale
from matplotlib import pyplot as plt

import numpy as np

learning_rate = 0.01

total_features, total_prices = load_boston(True)

# Keep 300 samples for training
train_features = scale(total_features[:300])
train_prices = total_prices[:300]

x = tf.placeholder(tf.float32, [None, 13])

l1 = tf.layers.dense(inputs=x, units=20, activation=tf.nn.elu)

l2 = tf.layers.dense(inputs=l1, units=20, activation=tf.nn.elu)

mu = tf.squeeze(tf.layers.dense(inputs=l2, units=1))
sigma = tf.squeeze(tf.layers.dense(inputs=l2, units=1))
sigma = tf.nn.softplus(sigma) + 1e-5

normal_dist = tf.contrib.distributions.Normal(mu, sigma)
samples = tf.squeeze(normal_dist._sample_n(1))

log_prob = -normal_dist.log_prob(samples)
prob = normal_dist.prob(samples)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

avg_cost = 0.0

feed_dict = {x: train_features}

p = sess.run(prob, feed_dict)
lp = sess.run(log_prob, feed_dict)

p 是我的概率输出,lp 是对数概率

谢谢!

4

1 回答 1

3

函数 .prob 和 .log_prob 是正态分布的 PDF 和 Log PDF:https ://en.wikipedia.org/wiki/Probability_density_function 。请注意,PDF 不必计算为 0 到 1 之间的值;它在一定范围内(与 CDF 相关)的积分必须介于 0 和 1 之间。

mu = 0考虑和的情况sigma = 1e-4。如果我们使用正态分布的 PDF:https://en.wikipedia.org/wiki/Normal_distribution,那么 PDF(0) ~= 4000!但是,如果我们要集成 PDF 并获取 CDF(或直接使用 CDF),那么我们将始终得到一个介于 0 和 1 之间的值。

于 2018-04-20T02:10:16.867 回答