在Tensorflow中,仅设置全局级种子会在循环的连续迭代中提供相同的输出

wkyowqbh  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(98)

我正在根据-https://www.tensorflow.org/api_docs/python/tf/random/set_seed中给出的规则测试tf.random.set_seed
特别是我正在测试第二个规则--我们只设置全局级种子,不设置操作级种子。
根据文档(上面提到了链接),第二条规则是:
如果设置了全局种子,但未设置操作种子:系统确定性地结合全局种子来挑选操作种子,使得其获得唯一随机序列。
为了解释第二条规则,文档使用以下代码段:

tf.random.set_seed(1234)
print(tf.random.uniform([1]))  # generates 'A1'
print(tf.random.uniform([1]))  # generates 'A2'

并指出,
我们在第二次调用tf.random.uniform时得到'A2'而不是'A1'的原因是第二次调用使用了不同的操作种子。
现在,我在形状为(3,)的1DTensor上测试了这个规则,以检查在循环的连续迭代中,重排Tensor的输出是否没有给予相同的序列,如下所示:

import tensorflow as tf

"""
Only global level seed
"""

tf.random.set_seed(1234)
   
constant_tensor = tf.constant([1,2,3])

for i in range(1, 15):
    shuffled_tensor = tf.random.shuffle(constant_tensor)
    print(shuffled_tensor)

我得到了以下输出:

tf.Tensor([3 1 2], shape=(3,), dtype=int32)
tf.Tensor([2 3 1], shape=(3,), dtype=int32)
tf.Tensor([2 1 3], shape=(3,), dtype=int32)
tf.Tensor([2 3 1], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([3 2 1], shape=(3,), dtype=int32)
tf.Tensor([2 1 3], shape=(3,), dtype=int32)
tf.Tensor([2 1 3], shape=(3,), dtype=int32)
tf.Tensor([2 3 1], shape=(3,), dtype=int32)
tf.Tensor([2 1 3], shape=(3,), dtype=int32)
tf.Tensor([3 2 1], shape=(3,), dtype=int32)
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor([3 2 1], shape=(3,), dtype=int32)
tf.Tensor([3 2 1], shape=(3,), dtype=int32)

从输出中可以看到,第7行和第8行的序列匹配,第13行和第14行的序列也匹配。
根据文档,tensorflow不应该在连续迭代中输出相同的序列。
那为什么我会得到这种输出?我误解了这个概念吗?
为了进一步测试这一点,我还测试了以下片段,我用它来生成14个1-DTensor,并检查是否有任何Tensor在连续运行中重复,如下所示:

import tensorflow as tf
tf.random.set_seed(1234)
for i in range(1, 15):
    print(tf.random.uniform(shape=[1], minval=1, maxval=15, dtype=tf.int32))

我得到了以下输出:

tf.Tensor([12], shape=(1,), dtype=int32)
tf.Tensor([8], shape=(1,), dtype=int32)
tf.Tensor([1], shape=(1,), dtype=int32)
tf.Tensor([2], shape=(1,), dtype=int32)
tf.Tensor([4], shape=(1,), dtype=int32)
tf.Tensor([3], shape=(1,), dtype=int32)
tf.Tensor([2], shape=(1,), dtype=int32)
tf.Tensor([7], shape=(1,), dtype=int32)
tf.Tensor([13], shape=(1,), dtype=int32)
tf.Tensor([11], shape=(1,), dtype=int32)
tf.Tensor([8], shape=(1,), dtype=int32)
tf.Tensor([3], shape=(1,), dtype=int32)
tf.Tensor([1], shape=(1,), dtype=int32)
tf.Tensor([4], shape=(1,), dtype=int32)

你可以看到没有两个连续的Tensor是重复的。为什么我在第一个片段中没有看到这种行为?

oymdgrw7

oymdgrw71#

两个不同的operation seed可以生成相同的序列,我认为不能保证没有两个连续的Tensor重复,例如:

tf.random.set_seed(1234)
print(tf.random.shuffle(constant_tensor, seed=6))
print(tf.random.shuffle(constant_tensor, seed=7))

#ouputs are same even though the `operation seed` is different.
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)

在第二个示例中,如果您减少maxval,您应该也会观察到重复发生。

相关问题