設置全局隨機種子。
用法
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。