TensorFlow:将种子重置为常量值不会产生重复结果

时间:2017-11-25 22:48:34

标签: python tensorflow

我在TensorFlow(版本1.4.0)中获得非重复结果,即使我每次都将种子重置为相同的值:

import tensorflow as tf
sess = tf.InteractiveSession()
for i in range(5):
    tf.set_random_seed(1234)
    print(sess.run(tf.random_uniform([1])))

输出结果为:

[ 0.96046877]
[ 0.85591054]
[ 0.20277488]
[ 0.81463408]
[ 0.75180626]

我不明白这与documentation

的一致性
  

如果设置了图级别种子,但操作种子不是:系统确定性地将操作种子与图级别种子一起选取,以便它获得唯一的随机序列。

这是不是意味着如果我设置图级别的种子(就像我一样,使用set_random_seed),并且我没有设置操作种子(就像在我的情况下,我没有在random_uniform中指定seed参数,我应该期望得到重复的结果吗?

this question中解决了类似的问题,但这里主要强调的是理解文档的含义。

其他详情:

>> tf.__version__
'1.4.0-rc0'

>> tf.__git_version__
'v1.3.0-rc1-3732-g2dd1015'

编辑1:

我想我猜想为什么会出现这种行为。

句子“系统确定性地选择与图级别种子结合的操作种子”并不意味着操作种子仅是图种子的函数。相反,它也是一些内部计数器变量的函数。这有道理的原因是,否则,运行

tf.set_random_seed(1234)
print(sess.run(tf.random_uniform([1])))
print(sess.run(tf.random_uniform([1])))

将产生两个相同的结果(这是由于(?)随机数生成器是无状态的,并且每个op都有自己的种子)。

为了证实这一点,我发现当终止python并再次打开它时,问题开头的整个代码序列确实会产生重复的结果。另外,深入研究TensorFlow的来源,我看到文件random_seed.py有行

  if graph_seed is not None:
    if op_seed is None:
      op_seed = ops.get_default_graph()._last_id
    seeds = _truncate_seed(graph_seed), _truncate_seed(op_seed)

表明op的种子是两个种子的组合:图形种子和图形的_last_id属性,它是在每个添加到图形的操作上增加的计数器。 / p>

0 个答案:

没有答案