【发布时间】:2021-12-01 16:06:54
【问题描述】:
我有两个变量mean 和stddev,它们是形状为 (1,) 的张量,它们代表许多具有平均值的正态分布,比如 mean[i] 和标准差 stddev[i]。
从这些分布中,我想为每个人在 [low,up,] 的范围内采样一个值,然后我想获得采样值的对数概率。
从docs 中,我发现experimental_sample_and_log_prob 方法几乎适合我,因为它不会对我想要的值范围(低、高)内的元素进行采样。
所以我编写了几行代码,但它自然不能很好地工作,而且计算量非常大。
import tensorflow as tf
from tensorflow_probability import distributions as tfd
def sample_and_log_prob(dist, up, down):
samples = dist.sample()
accepted = False
print("Is {} accepted? {}".format(samples, accepted))
while not accepted:
# sample < up
cond1 = tf.less_equal(samples, up)
# sample > down
cond2 = tf.greater_equal(samples, down)
# if down < sample < up
accepted = tf.logical_and(cond1, cond2)
samples = tf.where(
tf.logical_not(accepted),
samples,
dist.sample())
print("Is {} accepted? {}".format(samples, accepted))
return samples, dist.log_prob(samples)
distribution = tfd.Normal(
loc=mean ,
scale=stddev,
validate_args=True,
allow_nan_stats=False)
samples, log_probs = sample_and_log_prob(distribution, up=-1, down=1)
有什么解决办法吗?
【问题讨论】:
-
“它不能很好地工作”不是编程语句。这是什么意思?您遇到的具体问题是什么?
-
我的意思是它在计算方面非常昂贵。
标签: python tensorflow tensorflow-probability