为何tf.random.uniform在函数内生成重复值,主程序中却不会?
TensorFlow随机种子与@tf.function的常见问题解答
疑问1:函数内print的张量输出与返回值打印为何不同?
在被@tf.function装饰的函数中,代码执行分为图构建和图执行两个阶段:
- 函数内部的
print(a)、print(b)是在图构建阶段触发的,此时打印的是符号张量——也就是计算图中的节点定义,仅包含形状、数据类型等元信息,还未进行实际数值计算,因此不会显示numpy数组内容。 - 函数返回的张量是在图执行阶段生成的,此时TensorFlow会运行计算图得到实际数值,打印时自然会展示对应的numpy数组。
疑问2:为何函数内a和b的值相等?
这是Eager模式与图模式下随机种子机制的差异导致的:
- 在Eager模式(主程序直接运行代码)中,即便给
tf.random.uniform设置相同的seed=1,TensorFlow会自动生成一个隐式全局随机种子,每次调用随机操作时,会结合操作种子与全局种子生成不同的随机序列,因此两次调用得到不同结果。 - 在
@tf.function的图模式中,固定seed=1的tf.random.uniform操作会被固化到计算图中。图模式下的随机数生成是确定性的:只要种子固定,相同的随机操作每次执行都会输出完全一致的数值。所以两次调用tf.random.uniform([1], seed=1)会得到相同的张量值。
内容的提问来源于stack exchange,提问作者Mohammed Touami
相关产品推荐
相关产品推荐

