当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.random.set_seed用法及代码示例


设置全局随机种子。

用法

tf.random.set_seed(
    seed
)

参数

  • seed 整数。

依赖随机种子的操作实际上是从两个种子中派生出来的:全局种子和operation-level 种子。这设置了全局种子。

它与operation-level种子的交互如下:

  1. 如果既没有设置全局种子也没有设置操作种子:此操作使用随机挑选的种子。
  2. 如果设置了全局种子,但没有设置操作种子:系统确定性地选择与全局种子一起的操作种子,以便获得唯一的随机序列。在同一版本的 tensorflow 和用户代码中,此序列是确定性的。但是,在不同的版本中,此顺序可能会发生变化。如果代码依赖于特定的种子来工作,请明确指定全局和operation-level 种子。
  3. 如果设置了操作种子,但未设置全局种子:使用默认全局种子和指定的操作种子来确定随机序列。
  4. 如果全局和操作种子都设置了:两个种子一起使用来确定随机序列。

为了说明 user-visible 效果,请考虑以下示例:

如果全局种子和操作种子均未设置,则每次调用随机操作和每次重新运行程序都会得到不同的结果:

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'

我们在上面的 tf.random.uniform 的第二次调用中得到 'A2' 而不是 'A1' 的原因是因为第二次调用使用了不同的操作种子。

请注意,在这种情况下,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'

我们在上面的 tf.random.uniform 的第二次调用中得到 'A2' 而不是 'A1' 的原因是因为 TensorFlow 使用相同的 tf.random.uniform 内核(即内部表示)以相同的参数调用它,并且内核维护一个内部计数器,每次执行时都会递增,产生不同的结果。

调用 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'

当多个相同的随机操作包含在 tf.function 中时,它们的行为会发生变化,因为这些操作不再共享相同的计数器。例如:

@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)',请使用无状态随机操作,例如 tf.random.stateless_uniform 。另请参阅tf.random.experimental.Generator,了解一组新的有状态随机操作,它们使用外部变量来管理其状态。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.random.set_seed。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。