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


Python tf.random.Generator用法及代碼示例


隨機數發生器。

用法

tf.random.Generator(
    copy_from=None, state=None, alg=None
)

參數

  • copy_from 要從中複製的生成器。
  • state 一個 dtype STATE_TYPE 的向量,表示 RNG 的初始狀態,其長度和語義是特定於算法的。如果它是一個變量,生成器將重用它而不是創建一個新變量。
  • alg RNG算法。 Philox 算法的可能值為 tf.random.Algorithm.PHILOX,ThreeFry 算法的可能值為 tf.random.Algorithm.THREEFRY(參見論文“並行隨機數:與 1、2、3 一樣簡單”[https://www.thesalmons.org/john/random123/論文/random123sc11.pdf])。也可以使用字符串名稱"philox""threefry"。注意PHILOX 保證在所有架構(CPU、GPU、XLA 等)中產生相同的數字(給定相同的隨機狀態)。

屬性

  • algorithm RNG 算法 id(Python 整數或標量整數張量)。
  • key 基於計數器的 RNG 狀態的 'key' 部分。

    對於 counter-base RNG 算法,例如 Philox 和 ThreeFry(如論文“並行隨機數:像 1、2、3 一樣簡單”[https://www.thesalmons.org/john/random123/papers/random123sc11. pdf]),RNG狀態由兩部分組成:計數器和 key 。輸出通過以下公式生成:output=hash(key, counter),即由 key 參數化的計數器的散列。具有兩個不同 key 的兩個 RNG 可以被認為是生成兩個獨立的隨機數流(通過增加計數器形成一個流)。

  • state RNG 的內部狀態。

例子:

從種子創建生成器:

g = tf.random.Generator.from_seed(1234)
g.normal(shape=(2, 3))
<tf.Tensor:shape=(2, 3), dtype=float32, numpy=
array([[ 0.9356609 ,  1.0854305 , -0.93788373],
       [-0.5061547 ,  1.3169702 ,  0.7137579 ]], dtype=float32)>

從非確定性狀態創建生成器:

g = tf.random.Generator.from_non_deterministic_state()
g.normal(shape=(2, 3))
<tf.Tensor:shape=(2, 3), dtype=float32, numpy=...>

所有構造函數都允許顯式選擇Random-Number-Generation (RNG) 算法。支持的算法是 "philox""threefry" 。例如:

g = tf.random.Generator.from_seed(123, alg="philox")
g.normal(shape=(2, 3))
<tf.Tensor:shape=(2, 3), dtype=float32, numpy=
array([[ 0.8673864 , -0.29899067, -0.9310337 ],
       [-1.5828488 ,  1.2481191 , -0.6770643 ]], dtype=float32)>

具有相同算法和種子的 CPU、GPU 和 TPU 將生成相同的整數隨機數。 Float-point 結果(例如 normal 的輸出)可能在不同設備之間存在小的數值差異。

此類使用tf.Variable 來管理其內部狀態。每次生成隨機數時,生成器的狀態都會發生變化。例如:

g = tf.random.Generator.from_seed(1234)
g.state
<tf.Variable ... numpy=array([1234,    0,    0])>
g.normal(shape=(2, 3))
<...>
g.state
<tf.Variable ... numpy=array([2770,    0,    0])>

狀態的形狀是特定於算法的。

還有一個全局生成器:

g = tf.random.get_global_generator()
g.normal(shape=(2, 3))
<tf.Tensor:shape=(2, 3), dtype=float32, numpy=...>

tf.distribute.Strategy 範圍內創建生成器時,每個副本將獲得不同的隨機數流。

例如,在這段代碼中:

strat = tf.distribute.MirroredStrategy(devices=["cpu:0", "cpu:1"])
with strat.scope():
  g = tf.random.Generator.from_seed(1)
  def f():
    return g.normal([])
  results = strat.run(f).values

results[0]results[1] 將具有不同的值。

如果生成器是種子的(例如,通過 Generator.from_seed 創建),隨機數將由種子確定,即使不同的副本獲得不同的數字。可以將在副本上生成的隨機數視為副本 ID 的哈希值和可能對所有副本都通用的 "master" 隨機數。因此,整個係統仍然是確定性的。

(請注意,不同副本上的隨機數是不相關的,即使它們是由同一個種子確定性地確定的。它們不相關,因為無論對它們計算什麽統計數據,都不會有任何可辨別的相關性。 )

生成器可以使用 tf.train.Checkpoint 自由保存和恢複。可以在具有與原始策略不同數量的副本的分發策略中恢複檢查點。如果一個副本 ID 存在於原始分配策略和新分配策略中,則其狀態將被正確恢複(即來自恢複點的隨機數流將與來自保存點的隨機數流相同),除非副本已經發散在保存之前的 RNG 調用跟蹤中(例如,一個副本進行了一次 RNG 調用,而另一個副本進行了兩次 RNG 調用)。如果生成器保存在策略範圍內並在任何策略範圍之外恢複,我們沒有這樣的保證,反之亦然。

tf.distribute.experimental.ParameterServerStrategy 範圍內創建生成器時,工作人員將共享生成器的狀態(放置在參數服務器之一上)。這樣,工人仍然會得到不同的隨機數流,如上所述。 (這類似於 tf.distribute.MirroredStrategy 中的副本順序訪問在策略之外創建的生成器。)對 worker 的每個 RNG 調用都會對參數服務器產生 round-trip,這可能會對性能產生影響。創建 tf.distribute.experimental.ParameterServerStrategy 時,請確保 variable_partitioner 參數不會對形狀為 [2][3] 的小變量進行分片(因為不得對生成器狀態進行分片)。避免對小變量進行分片的方法包括將 variable_partitioner 設置為 None 或設置為 tf.distribute.experimental.partitioners.MinSizePartitioner 並具有足夠大的 min_shard_bytes(有關更多詳細信息,請參閱 tf.distribute.experimental.ParameterServerStrategy 的文檔)。

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.random.Generator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。