在Tensorflow中,只设置全局级别的种子在循环的连续迭代中产生相同的输出



我正在根据- 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,)的1D张量上测试了这个规则,以检查张量洗牌的输出是否在循环的连续迭代中没有给出相同的序列,如下所示:

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-D张量,并检查在连续运行中是否有张量重复,如下所示:

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)

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

两个不同的operation seed可以生成相同的序列。我不认为有任何保证没有两个连续张量重复。例如,

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,您应该观察到重复也发生了。

相关内容

  • 没有找到相关文章

最新更新