翻译源:https://www.tensorflow.org/api_docs/python/tf/random/set_seed
TensorFlow 》》TensorFlow Core v2.4.0 》》API》》 Python
see stable 看稳定版
see nightly 看最新测试版
(所谓nightly版本,通常是开发者自己维护的一个版本。白天的时候开发者们将各自的修改提交到一个中心代码库,然后在晚上做一次编译得到的版本。一般来说nightly版本会包含最新的错误修改和新增功能,所以适合那些关注某个错误,或者是特别喜欢最新版本的用户使用。但是因为没有经过充分的测试,可能会有很多不稳定的地方。另外,在比较大的项目里,由于不同的模块可能有各自自己的分支代码库,所以即使是nightly也不一定能反映最新的进展,这时可能需要专门去找某个分支的自己的nightly。例如,浏览器里做javascript的和做页面rendering的就可能各自有自己的分支代码库,一个功能可能要在组内的分支代码库酝酿修改很长时间,只有觉得基本上成熟的时候才会把代码送到中心代码库,进入当晚的nightly。)
设置全局随机种子。
tf.random.set_seed(
seed
)
用在笔记本上
在教程中使用
(1)简单音频识别:识别关键词
(2)使用估计器的增强树
(3)梯度增强树:模型理解
(4)用演员-评论家的方法玩钢管舞
(5)张量流概率案例研究:协方差估计
依赖于随机种子的操作实际上是从两个种子中派生出来的:”全局种子“( global )和”操作级种子”(operation-level seeds)。这就设定了”全局种子“。
它与"操作级种子"的交互如下:
1.如果既没有设置全局种子也没有设置操作种子,则一个随机选择的种子用于该操作
2.如果设置了图级种子(graph-level seed),但没有设置操作种子(operation seed):系统确定性地选择与图级种子结合的操作种子,以便它获得唯一的随机序列(unique random sequence)。在同一个版本的张量流和用户代码中,这个序列是确定的。然而,在不同的版本中,这个顺序可能会改变。如果代码依赖于特定的种子来工作,请明确指定图形级和操作级种子。
3.如果设置了操作种子,但没有设置全局种子:使用默认的全局种子和指定的操作种子来确定随机序列。
4.如果同时设置了全局种子和操作种子:两个种子一起用于确定随机序列。
为了说明用户可见的效果,请考虑以下示例:
1.如果既没有设置全局种子,也没有设置操作种子,那么对随机操作的每次调用和程序的每次重新运行都会得到不同的结果:
(现在关闭程序并再次运行)
2.如果设置了全局种子,但没有设置操作种子,那么我们对随机操作的每次调用都会得到不同的结果,但对程序的每次重新运行都会得到相同的序列:
(现在关闭程序并再次运行)
我们在上面的tf.random.uniform的第二次调用中得到“A2”而不是“A1”的原因是因为第二次调用使用了不同的操作种子。
请注意,在这种情况下,tf.function的行为类似于程序的重新运行。当设置了全局种子但未设置操作种子时,每个函数的随机数序列是相同的。例如:
假设设置了操作种子,我们对随机操作的每次调用都会得到不同的结果,但对程序的每次重新运行都会得到相同的结果:
(现在关闭程序并再次运行)
我们之所以在上面的第二次调用tf.random.uniform时得到‘A2’而不是‘A1’,是因为TensorFlow对其所有具有相同参数的调用使用了相同的tf.random.uniform内核(即内部表示),并且内核维护一个内部计数器,该计数器每次执行时都会递增,从而产生不同的结果。
调用tf.random.set_seed将重置任何此类计数器:
当多个相同的随机操作被包装在一个tf.function中时,它们的行为会改变,因为这些操作不再共享同一个计数器。例如:
foo函数的第二次调用返回'(A2,A2)',而不是'(A1,A1 '),因为tf.random.uniform维护一个内部计数器。
如果您希望foo每次都返回'(A1,A1 '),请使用无状态随机操作,如tf.random.stateless_uniform。(https://www.tensorflow.org/api_docs/python/tf/random/stateless_uniform)
另请参见tf.random.experimental.Generator了解一组新的有状态随机操作,这些操作使用外部变量来管理它们的状态。
(https://www.tensorflow.org/api_docs/python/tf/random/Generator)
参数 变量类型
seed 整形