隨機數發生器。
用法
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
的文檔)。
相關用法
- Python tf.random.Generator.binomial用法及代碼示例
- Python tf.random.Generator.make_seeds用法及代碼示例
- Python tf.random.Generator.split用法及代碼示例
- Python tf.random.truncated_normal用法及代碼示例
- Python tf.random.stateless_uniform用法及代碼示例
- Python tf.random.shuffle用法及代碼示例
- Python tf.random.stateless_parameterized_truncated_normal用法及代碼示例
- Python tf.random.normal用法及代碼示例
- Python tf.random.experimental.stateless_split用法及代碼示例
- Python tf.random.stateless_poisson用法及代碼示例
- Python tf.random.set_global_generator用法及代碼示例
- Python tf.random.uniform用法及代碼示例
- Python tf.random.categorical用法及代碼示例
- Python tf.random.stateless_binomial用法及代碼示例
- Python tf.random.experimental.stateless_fold_in用法及代碼示例
- Python tf.random.stateless_categorical用法及代碼示例
- Python tf.random.set_seed用法及代碼示例
- Python tf.random.poisson用法及代碼示例
- Python tf.random.gamma用法及代碼示例
- Python tf.random.create_rng_state用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.random.Generator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。