使用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个随机数。摘要作者的图表“跳过”一些随机数;因此,根据摘要的编写时间与全局步骤相关,您会得到随机不同的结果。
此影响具有不良后果的另一个示例是,当您使用Tensorflow记录阅读器进行批处理时,使用Supervisor编写摘要会导致由于额外的图形评估而在每次摘要编写时消耗额外的一批数据。
这也会影响依赖于Supervisor的所有工具的行为,例如Tensorflow-slim。
是否有传统方式与主管沟通,以便在同一图表评估中收集操作及其各自的摘要?
我想通过定义操作及其摘要之间的依赖关系并传递summary_op=None
,可以解决这个问题。
答案 0 :(得分:0)
这种情况似乎已在tf.train.MonitoredTrainingSession中得到解决,它取消了主管:
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]