4

我正在尝试使用tensorflow-probability并开始使用一些非常简单的东西:

import tensorflow as tf
import tensorflow_probability as tfp

tf.enable_eager_execution()

tfd = tfp.distributions
poiss = tfd.Poisson(0.8)

poiss.sample(2, seed=1)
#> Out: <tf.Tensor: id=3569, shape=(2,), dtype=float32, numpy=array([0., 0.], dtype=float32)>

poiss.sample(2, seed=1)
#> Out: <tf.Tensor: id=3695, shape=(2,), dtype=float32, numpy=array([1., 0.], dtype=float32)>

poiss.sample(2, seed=1)
#> Out: <tf.Tensor: id=3824, shape=(2,), dtype=float32, numpy=array([2., 2.], dtype=float32)>

poiss.sample(2, seed=1)
#> Out: <tf.Tensor: id=3956, shape=(2,), dtype=float32, numpy=array([0., 1.], dtype=float32)>

我想当重复使用相同的种子时我会得到相同的结果,但不知何故,这不是真的。

我也尝试过不eager执行,但结果仍然无法重现。如果我添加类似tf.set_random_seed(12).

我想我缺少一些基本的东西?

对于那些感兴趣的人,我在 Ubuntu 16.04 上运行Python 3.5.2

张量流-概率==0.5.0
张量流==1.12.0

4

3 回答 3

4

对于图形模式下的确定性输出,您需要同时设置图形随机种子 ( tf.set_random_seed) 和 op 随机种子 (seed=在您的示例调用中)。

TFv2 中随机采样器的工作原理仍在整理中。目前,我最好的理解是,如果您想要确定性的输出,您可以在每次调用采样器tf.set_random_seed之前调用采样器,传递采样器 a 。seed=

于 2019-02-11T19:44:56.733 回答
2

现在更简洁了,我们支持 TFP 中的完全确定性随机性。您可以传递一个包含两个整数的元组作为种子,或者传递一个形状为 (2,) 的张量来触发确定性行为。tfp.random.split_seed 在这里也很重要。

于 2020-10-29T01:48:27.207 回答
1

除了在 mcmc 中为 sample 或 sample_chain 设置种子之外,您可能还需要设置以下内容:

seed = 24
os.environ['TF_DETERMINISTIC_OPS'] = 'true'
os.environ['PYTHONHASHSEED'] = f'{seed}'
np.random.seed(seed)
random.seed(seed)
tf.random.set_seed(seed)
于 2020-09-25T15:10:20.267 回答