tensorflow.merge_all_summaries()挂起

时间:2016-08-15 17:15:43

标签: python tensorflow

我遇到了问题,如果我在培训期间运行sess.run(tf.merge_all_summaries()),程序将会挂起。这也是在a github issue中提出来的,虽然我不确定我的问题是否相同。

作为参考,这是我用来训练的代码:

logits = fcn8.upscore  # last layer of the network
loss = softmax_loss(logits, lb, pipe.NUM_CLASSES)

train_op = build_graph(loss, global_step)
saver = tf.train.Saver(tf.all_variables())
summary_op = tf.merge_all_summaries()

sess.run(tf.initialize_all_variables())
tf.train.start_queue_runners(sess=sess)
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir, sess.graph)

for step in range(FLAGS.max_epochs * pipe.EPOCH_LENGTH):
  if sess.run(queue.size()) == 0:
    sess.run(enqueue_files)

  _, loss_val = sess.run([train_op, loss])

  if step % 10 == 0:
    print('loss at step {}: {}'.format(step, loss_val))
    summary = sess.run(summary_op)  # hangs here
    summary_writer.add_summary(summary, step)

这是常见的事吗?或者我在编写培训代码时遇到了一些错误?提前感谢您的帮助。

编辑:似乎唯一一次发生这种情况是当我尝试合并摘要时队列为空。我想知道这是不是巧合。

1 个答案:

答案 0 :(得分:1)

您的summary_op可能触发队列出列时将挂起的队列出队。

一种解决方法是使用变量重构代码,以便摘要不会触发队列出队,就像这里一样 - TensorFlow: Reading images in queue without shuffling

更简单的解决方法是在截止日期前初始化您的会话,以便在一段时间之后您的空出列失败并DeadlineExceeded而不是挂起

tf.reset_default_graph()
queue = tf.FIFOQueue(capacity=5, dtypes=[tf.int32])
config = tf.ConfigProto()
config.operation_timeout_in_ms=2000
sess = tf.InteractiveSession("", config=config)
try:
    sess.run(queue.dequeue())
except tf.errors.DeadlineExceededError:
    print "DeadlineExceededError detected"