我在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>