使用种子采样张量流概率

时间:2019-02-11 13:47:24

标签: tensorflow random tensorflow-probability

我正在尝试使用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
  

tensorflow-probability == 0.5.0
  tensorflow == 1.12.0

3 个答案:

答案 0 :(得分:1)

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

TFv2中的随机采样器仍在运行sorted out。就目前而言,我的最佳理解是,您可以在对每个采样器进行每次调用之前先调用tf.set_random_seed,然后将采样器一个seed=传递给采样器,如果您希望有确定性的输出。

答案 1 :(得分:0)

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

...    
include_directories(/home/user/occt/build_r/include/opencascade/)   

add_executable(testOCCT
    main.cpp
    step2stl.cpp
)

find_package(OpenCASCADE REQUIRED NO_DEFAULT_PATH) 

set(OCCT_LIBS TKMesh; TKSTEP; TKSTL; TKXSBase; TKernel)
target_link_libraries(testOCCT ${OCCT_LIBS})

答案 2 :(得分:0)

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