我注意到,即使计算基本相同,即使对TensorFlow图进行最轻微的更改也会对结果产生随机影响。
在以下示例中,在添加变量tf.no_op
之前向图表添加y
会更改该变量的初始值:
def example(add_no_op=False):
tf.reset_default_graph()
tf.set_random_seed(42)
x = tf.get_variable('x', shape=[], dtype=tf.float32)
if add_no_op:
tf.no_op()
y = tf.get_variable('y', shape=[], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([x, y]))
>>> example()
[0.47769845, 0.014582992]
>>> example(add_no_op=True)
[0.47769845, 0.3524617]
这不是我所期望的。使用相同的随机种子,即使模型略有不同,我也会期望相同的结果,只要变量以相同的顺序添加并且没有其他非确定性来源。
一般来说,当我重构一段代码时,检查它仍然产生相同的输出是确保我没有破坏它的好方法。但是,在TensorFlow中,这似乎不起作用。
为什么会发生这种情况?如何防止它发生?