通过使用tf.set_random_seed(1234)
设置随机种子,到目前为止,我可以完全重复进行训练。但是,在图形中引入额外的变量时,我注意到有细微的偏差。在下面的示例中,B
和C
产生完全相同的损耗,但是A
给出了一些(但不是完全)不同的东西。重要的是要注意,在C
版中,intermediate_tensor
ist未附加任何内容。
# version A:
output_tensor = input_tensor
# version B:
intermediate_tensor = input_tensor[..., :]
output_tensor = intermediate_tensor
# version C:
intermediate_tensor = input_tensor[..., :]
output_tensor = input_tensor
任何见解,我将不胜感激,因为我无法解释这种行为。图的内容可能会影响随机数生成器吗?
答案 0 :(得分:1)
依赖于随机种子的操作实际上是从两个种子派生的:图形级种子和操作级种子。这将设置图级种子。
如果设置了图级别的种子,但未设置操作种子:系统确定性地选择一个操作种子和图级别的种子,以便获得唯一的随机序列。
是的,PRNG有影响。完整描述为here(警告您要阅读一长篇文章!)。种子的默认值为None。如果是这样,他们会随机initialized afterwards
seed = random::New64();
seed2 = random::New64();
并且有一个(猜测是什么,一个惊喜)梅森扭曲器引擎behind。
对于GPU操作,他们使用Philox algorithm
,它也是基于计数器的。
处理datasets时也是如此。
您应该为每个操作指定一个随机种子,以防止所有这种随机填充的魔术。
总而言之,所有其他的random-op节点都会更改初始种子。但是在简单的情况下:
import tensorflow as tf
tf.set_random_seed(1234)
out1 = tf.random_normal([1])
out2 = tf.sqrt(tf.square(tf.random_normal([1])))
# out2 = tf.random_normal([1])
with tf.Session() as sess:
print(sess.run([out1, out2]))
输出相同(在上面的out2
中注释/输入):
[array([-0.1386252], dtype=float32), array([-1.3978306], dtype=float32)]
[array([-0.1386252], dtype=float32), array([1.3978306], dtype=float32)]
如果您希望在一个会话中进行这些可重复运行,请参阅