此页面由 Cloud Translation API 翻译。
Switch to English

tf.random.set_seed

GitHub上查看源代码

设置全局随机种子。

用在笔记本电脑

使用教程

全球和操作层面的种子:依靠随机种子操作实际上是从两号种子得到它。这台全球种子。

它与操作层面的种子相互作用如下:

  1. 如果既没有全局种子也不动作种子被设置:一个随机挑选的种子被用于这个运算。
  2. 如果图形一级的种子被设定,但操作种子不是:使得它得到一个唯一的随机序列的系统,确定性地挑选与图表一级的种子一起的操作的种子。在同一个版本tensorflow和用户代码,这个序列是确定性的。但是在不同的版本中,这个顺序可能会改变。如果代码依赖于特定的种子工作,同时指定图形的水平和操作水平的种子明确。
  3. 如果操作种子设定,但全球种子未设置:默认的全球种子和指定的操作的种子被用来确定的随机序列。
  4. 如果全球和操作种子被设定:两个种子结合使用,以确定随机序列。

为了说明用户明显的影响,考虑这些例子:

如果没有全球的种子,也没有操作的种子设定,我们可以得到每次调用随机运算和程序的每个重新运行不同的结果:

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

(现在关闭程序并再次运行)

 print(tf.random.uniform([1]))  # generates 'A3'
print(tf.random.uniform([1]))  # generates 'A4'
 

如果全球种子设定,但操作的种子没有设置,我们得到不同的结果每次调用随机运算,但该计划的每一个重新运行相同的序列:

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

(现在关闭程序并再次运行)

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

我们得到“A2”,而不是“A1”上的第二个呼叫的原因tf.random.uniform以上是因为第二呼叫使用不同的操作的种子。

需要注意的是tf.function就像在这种情况下,程序的重新运行。当全球种子设定,但操作的种子没有设置,随机数序列是每个相同tf.function 。例如:

 tf.random.set_seed(1234)

@tf.function
def f():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])
  return a, b

@tf.function
def g():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])
  return a, b

print(f())  # prints '(A1, A2)'
print(g())  # prints '(A1, A2)'
 

如果操作种子设定,我们可以得到每次调用随机运算,但该计划的每一个重新运行相同的序列不同的结果:

 print(tf.random.uniform([1], seed=1))  # generates 'A1'
print(tf.random.uniform([1], seed=1))  # generates 'A2'
 

(现在关闭程序并再次运行)

 print(tf.random.uniform([1], seed=1))  # generates 'A1'
print(tf.random.uniform([1], seed=1))  # generates 'A2'
 

我们得到“A2”,而不是“A1”上的第二个呼叫的原因tf.random.uniform以上是因为相同tf.random.uniform内核(即内部表示)可以使用相同的参数的所有电话使用TensorFlow和内核维护时递增每次执行时,产生不同的结果的内部计数器。

调用tf.random.set_seed将重置任何这样的计数器:

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

当多个相同的随机OPS被包裹在一个tf.function ,他们的行为改变,因为OPS没有长共享相同的计数器。例如:

 @tf.function
def foo():
  a = tf.random.uniform([1], seed=1)
  b = tf.random.uniform([1], seed=1)
  return a, b
print(foo())  # prints '(A1, A1)'
print(foo())  # prints '(A2, A2)'

@tf.function
def bar():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])
  return a, b
print(bar())  # prints '(A1, A2)'
print(bar())  # prints '(A3, A4)'
 

的第二呼叫foo返回'(A2,A2)'而不是'(A1,A1)',因为tf.random.uniform维护内部计数器。如果你想foo ,以回报“(A1,A1)”每一次,使用无状态的随机OPS如tf.random.stateless_uniform 。另请参阅tf.random.experimental.Generator一套新的使用外部变量来管理他们的国家有状态的随机OPS的。

seed 整数。