为何TensorFlow的random.truncated_normal同种子返回不同结果?
为什么两次调用
tf.random.truncated_normal(seed=1234)结果不同? 核心原因
你设置的seed是操作级种子,它的作用是保证单个随机操作在不同环境(比如不同机器、不同会话)下的可复现性,而非让每次调用该函数都输出相同结果。
每次调用tf.random.truncated_normal(seed=xxx)时,TensorFlow都会在默认图中创建一个新的随机数生成器实例。哪怕seed相同,每个实例的内部状态是独立推进的,所以两次调用会生成不同的随机数序列。
实现两次输出相同结果的方法
有两种可靠的方式:
方法1:设置全局种子
通过全局种子固定整个TensorFlow运行环境的随机数生成状态,所有随机操作都会基于同一个全局状态生成序列:
import tensorflow as tf tf.random.set_seed(1234) # 固定全局种子 print(tf.random.truncated_normal(shape=[2])) print(tf.random.truncated_normal(shape=[2]))
执行后两次输出会完全一致。
方法2:复用随机数生成器对象
创建一个固定种子的生成器实例,通过控制生成器的状态来复现结果:
import tensorflow as tf # 创建带固定种子的生成器 rng = tf.random.Generator.from_seed(1234) # 第一次生成 print(rng.truncated_normal(shape=[2])) # 重置生成器状态到初始种子 rng.reset_from_seed(1234) # 第二次生成,结果和第一次一致 print(rng.truncated_normal(shape=[2]))
内容的提问来源于stack exchange,提问作者zell
相关产品推荐
相关产品推荐

