我遇到了问题,如果我在培训期间运行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)
这是常见的事吗?或者我在编写培训代码时遇到了一些错误?提前感谢您的帮助。
编辑:似乎唯一一次发生这种情况是当我尝试合并摘要时队列为空。我想知道这是不是巧合。
答案 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"