我正在根据-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是重复的。为什么我在第一个片段中没有看到这种行为?
1条答案
按热度按时间oymdgrw71#
两个不同的
operation seed
可以生成相同的序列,我认为不能保证没有两个连续的Tensor重复,例如:在第二个示例中,如果您减少
maxval
,您应该也会观察到重复发生。