设置全局随机种子。
用法
tf.random.set_seed(
seed
)
参数
-
seed
整数。
依赖随机种子的操作实际上是从两个种子中派生出来的:全局种子和operation-level 种子。这设置了全局种子。
它与operation-level种子的交互如下:
- 如果既没有设置全局种子也没有设置操作种子:此操作使用随机挑选的种子。
- 如果设置了全局种子,但没有设置操作种子:系统确定性地选择与全局种子一起的操作种子,以便获得唯一的随机序列。在同一版本的 tensorflow 和用户代码中,此序列是确定性的。但是,在不同的版本中,此顺序可能会发生变化。如果代码依赖于特定的种子来工作,请明确指定全局和operation-level 种子。
- 如果设置了操作种子,但未设置全局种子:使用默认全局种子和指定的操作种子来确定随机序列。
- 如果全局和操作种子都设置了:两个种子一起使用来确定随机序列。
为了说明 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
,了解一组新的有状态随机操作,它们使用外部变量来管理其状态。
相关用法
- Python tf.random.set_global_generator用法及代码示例
- Python tf.random.stateless_uniform用法及代码示例
- Python tf.random.shuffle用法及代码示例
- Python tf.random.stateless_parameterized_truncated_normal用法及代码示例
- Python tf.random.stateless_poisson用法及代码示例
- Python tf.random.stateless_binomial用法及代码示例
- Python tf.random.stateless_categorical用法及代码示例
- Python tf.random.stateless_gamma用法及代码示例
- Python tf.random.truncated_normal用法及代码示例
- Python tf.random.Generator用法及代码示例
- Python tf.random.Generator.binomial用法及代码示例
- Python tf.random.normal用法及代码示例
- Python tf.random.experimental.stateless_split用法及代码示例
- Python tf.random.uniform用法及代码示例
- Python tf.random.categorical用法及代码示例
- Python tf.random.experimental.stateless_fold_in用法及代码示例
- Python tf.random.Generator.make_seeds用法及代码示例
- Python tf.random.poisson用法及代码示例
- Python tf.random.gamma用法及代码示例
- Python tf.random.create_rng_state用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.random.set_seed。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。