张量流中的随机状态是否受图结构的影响?

时间:2018-08-20 13:48:34

标签: tensorflow random

通过使用tf.set_random_seed(1234)设置随机种子,到目前为止,我可以完全重复进行训练。但是,在图形中引入额外的变量时,我注意到有细微的偏差。在下面的示例中,BC产生完全相同的损耗,但是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

任何见解,我将不胜感激,因为我无法解释这种行为。图的内容可能会影响随机数生成器吗?

1 个答案:

答案 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)]

如果您希望在一个会话中进行这些可重复运行,请参阅

Reproducible results in Tensorflow with tf.set_random_seed

相关问题