当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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