随机数发生器。
用法
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。