當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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