2016-08-15 86 views
1

我一直有一个问题,如果我在训练期间运行sess.run(tf.merge_all_summaries()),程序将挂起。这也引起了a github issue,虽然我不确定我的问题是否一样。tensorflow.merge_all_summaries()挂起

供参考,这是我使用的火车代码:

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

您的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"