You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow随机种子细节:重复运行op生不同值的原因与解决方法

TensorFlow 1.x随机种子问题解答

问题1:为什么print(sess.run(a))每次生成不同数值?

这得从TensorFlow 1.x随机数生成的核心机制说起:

  • 你定义的a是同一个随机操作节点,每个带种子的随机操作都会关联一个内部的随机数生成器状态。当你在同一个Session中多次运行这个操作时,每次运行都会推进该生成器的状态(相当于取下一个随机数),结果自然会变化。
  • 而print(sess.run(tf.random_uniform([1], seed=1)))每次调用都会创建全新的随机操作节点,每个新节点都带着相同的操作级种子和图级种子,因此每个新节点的随机序列初始状态完全一致,所以每次运行都能得到固定值。
  • 至于用新Session(sess1)运行a时,新Session会基于种子重新初始化a关联的随机生成器状态,因此每次运行都是固定值。

问题2:如何在不使用with tf.Session() as sess1:的情况下让它生成固定值?

分两种场景给出解决方案:

场景1:每次运行整个脚本时得到固定值

调整代码执行顺序,先设置图级种子、创建操作,再启动Session。这样Session初始化时会基于种子正确初始化随机状态,每次启动脚本运行a都会得到固定值:

import tensorflow as tf
# 先设置图级种子
tf.random.set_random_seed(1)
# 创建带操作级种子的随机操作
a = tf.random_uniform([1], seed=1)
# 最后启动Session
sess = tf.Session()
print(sess.run(a))  # 每次运行脚本都会输出相同值

场景2:在同一个Session中多次运行a都得到固定值

如果你想在同一个Session里反复运行a都拿到相同结果,可以通过关闭并重新创建Session的方式(不需要with语句),让随机生成器状态重新初始化:

import tensorflow as tf
sess = tf.Session()
tf.random.set_random_seed(1)
a = tf.random_uniform([1], seed=1)

# 第一次运行
print(sess.run(a))
# 关闭当前Session,重新创建
sess.close()
sess = tf.Session()
# 再次运行,得到和第一次相同的值
print(sess.run(a))

另一种替代思路:不要复用a这个操作节点,每次需要固定值时就重新创建带种子的tf.random_uniform操作,这样即使在同一个Session中,每次运行新的操作节点都会得到固定值,就像你之前测试的print(sess.run(tf.random_uniform([1], seed=1)))那样。


内容的提问来源于stack exchange,提问作者Mencia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:05:53