1

使用 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.

4

1 回答 1

0

这种情况似乎已经在 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]
于 2018-03-14T05:33:02.973 回答