Tensor Flow shuffle_batch()在纪元结束时阻塞

时间:2015-12-04 02:11:04

标签: python tensorflow

我使用tf.train.shuffle_batch()创建批量输入图像。它包含一个min_after_dequeue参数,用于确保内部队列中有指定数量的元素,如果没有,则阻止其他所有元素。

images, label_batch = tf.train.shuffle_batch(
  [image, label],
  batch_size=FLAGS.batch_size,
  num_threads=num_preprocess_threads,
  capacity=FLAGS.min_queue_size + 3 * FLAGS.batch_size,
  min_after_dequeue=FLAGS.min_queue_size)

在一个时代结束时,当我进行评估时(我确信这在培训中也是如此,但我还没有对其进行测试),一切都会阻止。我发现它同时内部的shuffle批处理队列将留下少于min_after_dequeue的元素。在程序的这个时候,我最好只是将剩下的元素出列,但我不确定如何。

显然,当您知道不再有使用.close()方法排队的元素时,可以关闭TF队列中的这种类型的阻塞。但是,由于底层队列隐藏在函数内部,我该如何调用该方法?

2 个答案:

答案 0 :(得分:3)

如果队列中的元素数少于min_after_dequeue,运行RandomShuffleQueue.close()操作将阻止出列线程阻塞,这是正确的。

tf.train.shuffle_batch()函数创建一个tf.train.QueueRunner,在后台线程中对队列执行操作。如果您按照以下方式启动它,传递tf.train.Coordinator,您就可以干净地关闭队列(基于示例here):

sess = tf.Session()
coord = tf.train.Coordinator()
tf.train.start_queue_runners(sess, coord=coord)

while not coord.should_stop():
  sess.run(train_op)
# When done, ask the threads to stop.
coord.request_stop()
# And wait for them to actually do it.
coord.join(threads)

答案 1 :(得分:1)

有一个可选参数allow_smaller_final_batch

" allow_smaller_final_batch :(可选)布尔值。如果为True,如果队列中剩余的项目不足,则允许最终批次更小。"