我想用MonitoredTrainingSession
每个纪元或批处理输出我的损失。
理想情况下,我希望得到一个标志,该标志已经结束,或者能够像keras一样提供回调。我看到我也可以通过手动计算步骤来实现,但我想使用tf功能,这似乎仍然记录不足。
根据我在文档中找到的内容,我们可以使用tf.train.LoggingTensorHook
每n
个步骤打印张量。
但问题是它的打印频率与我的要求不同。当我使用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源代码似乎没什么帮助。任何谷歌人都知道它在做什么?
答案 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()
的调用中添加要运行的当前张量,以便下次记录其值。