使用Tensorflow Supervisor编写摘要会重新评估图形,这可能会产生不期望的结果。
这样的结果之一是改变了随机状态,进而影响了可重复性。我已经写了一个小例子来演示这种影响。
import tensorflow as tf
N = 5
SEED = 123
with tf.Graph().as_default():
tf.set_random_seed(SEED)
a = tf.random_uniform([1])
with tf.Session() as sess:
for i in range(N):
print(sess.run([a]))
# result: [0.31000066],[0.36025488],[0.9802418],[0.94300663],[0.03890145]
with tf.Graph().as_default():
tf.set_random_seed(SEED)
a = tf.random_uniform([1])
summary = tf.summary.scalar(name='a', tensor=a[0])
sv = tf.train.Supervisor(logdir="./tmp", summary_op=summary,
save_summaries_secs=0.1)
with sv.managed_session() as sess:
for _ in range(N):
print(sess.run(a))
# result of first run: [0.9802418],[0.94300663],[0.03890145],[0.2266953],[0.42769837]
# result of second run:[0.36025488],[0.9802418],[0.94300663],[0.03890145],[0.2266953]在上面的示例中,我定义了两个图,这两个图都具有相同的图级随机种子。在第二张图中,我使用tf.train.Supervisor编写摘要。然后,我通过评估每个图N次来生成N个随机数。带有摘要编写器的图“跳过”一些随机数;因此,根据摘要相对于全局步骤的写入时间,您会得到随机不同的结果。
这还会影响依赖于Supervisor的所有工具的行为,例如Tensorflow-slim。
是否有一种常规方式与主管沟通,以便在同一图形评估中收集操作及其各自的摘要?我认为可以通过定义操作和它们的摘要之间的依赖关系并传递summary_op=None来解决这个问题。
发布于 2018-03-14 13:33:03
这种情况似乎已经在tf.train.MonitoredTrainingSession中得到了解决,它不建议使用Supervisor:
with tf.Graph().as_default():
tf.set_random_seed(SEED)
a = tf.random_uniform([1])
summary = tf.summary.scalar(name='a', tensor=a[0])
step = tf.Variable(0, trainable=False, name='global_step')
with tf.train.MonitoredTrainingSession(checkpoint_dir="./tmp2",
save_summaries_steps=1) as sess:
for _ in range(N):
print(sess.run([a]))
# result: [0.31000066],[0.36025488],[0.9802418],[0.94300663],[0.03890145]https://stackoverflow.com/questions/49266894
复制相似问题