在`tf.train.MonitoredTrainingSession`期间输出批/历元训练损失

时间:2017-09-22 17:26:45

标签: tensorflow

我想用MonitoredTrainingSession每个纪元或批处理输出我的损失。 理想情况下,我希望得到一个标志,该标志已经结束,或者能够像keras一样提供回调。我看到我也可以通过手动计算步骤来实现,但我想使用tf功能,这似乎仍然记录不足。

根据我在文档中找到的内容,我们可以使用tf.train.LoggingTensorHookn个步骤打印张量。

但问题是它的打印频率与我的要求不同。当我使用every_n_iter=4运行以下时,我会在第二次迭代时获得输出:

tf.reset_default_graph()
with g.as_default():
    loghook = tf.train.LoggingTensorHook([tf.reduce_mean(loss, name='m_loss')],
                                         every_n_iter=4,
                                         formatter=lambda x: "LOSS\t%.4f" % [tt for kk,tt in x.items() if kk.name.startswith('m_loss')][-1]
                                        )
    optimizer = get_optimizer(lr=lr, opt_name = opt_name)
    training_op = optimizer.minimize(loss)
    init_op = tf.global_variables_initializer()
    with tf.Session(graph=g) as sess:    
        sess.run(init_op)
    with tf.train.MonitoredTrainingSession(log_step_count_steps=1, hooks=[loghook]) as sess:
        losslist = []
        while not sess.should_stop():
            print('.')
            loss_ = sess.run(loss, feed_dict={K.learning_phase():1})
            sess.run(training_op)
            losslist.append(np.mean(loss_))

我得到的输出如下:

.
INFO:tensorflow:LOSS    2.2416
.
.
INFO:tensorflow:LOSS    2.1547
.
.
INFO:tensorflow:LOSS    2.1186
.
.

等。也就是它每隔2步输出一次,而不是每4次输出一次。

文档说:

every_n_iter: `int`, print the values of `tensors` once every N local
      steps taken on the current worker.

我在一台本地计算机上运行它。为什么一个地方步骤"等于两个循环python迭代?为什么两个而不是五个?

查看Python源代码似乎没什么帮助。任何谷歌人都知道它在做什么?

1 个答案:

答案 0 :(得分:1)

"本地步骤"每次调用sess.run()时都会递增。您在while循环中调用sess.run()两次。

以下是相关代码的一些指示: https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/python/training/basic_session_run_hooks.py#L255 - 每次调用sess.run()后递增_iter_count。

https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/python/training/basic_session_run_hooks.py#L228 - 如果_iter_count应触发记录,请在以下对sess.run()的调用中添加要运行的当前张量,以便下次记录其值。