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
相关产品推荐
相关产品推荐

