添加新的队列运行程序会导致程序过早退出

时间:2017-03-19 12:24:21

标签: tensorflow queue

我有一个带图像的目录和另一个带有标签文件的目录(对于每个图像)。我正在尝试使用队列和读取操作来读取图像和标签。

image_file_queue = tf.train.string_input_producer(image_files, num_epochs=1, shuffle=False)

image_reader = tf.WholeFileReader()
image_contents = image_reader.read(image_file_queue)[1]

image = tf.image.decode_jpeg(image_contents, channels=3)
image = tf.image.resize_images(image, [image_size, image_size])

image_batch = tf.train.batch([image],
                             batch_size,
                             num_threads=4,
                             capacity=2 * batch_size,
                             allow_smaller_final_batch=True)

label_file_queue = tf.train.string_input_producer(label_files, num_epochs=1, shuffle=False)
label_reader = tf.WholeFileReader()
label_contents = tf.string_split([label_reader.read(label_file_queue)[1]], delimiter='\n').values

labels = tf.decode_csv(label_contents, [tf.constant([], dtype=tf.float32)] * 5, field_delim=' ')
label_queue = tf.FIFOQueue(2 * batch_size, [tf.float32])

enqueue_op = label_queue.enqueue([labels])

label_queue_runner = tf.train.QueueRunner(label_queue, enqueue_ops=[enqueue_op] * 2)
tf.train.add_queue_runner(label_queue_runner)

coord = tf.train.Coordinator()
sess.run(tf.group(tf.local_variables_initializer(), tf.global_variables_initializer()))

threads = tf.train.start_queue_runners(sess=sess, coord=coord)

然而,这不起作用。在此之后,coord.should_stop()会立即返回True。评论tf.train.add_queue_runner(...)确实有效,即计算image_batch并且我能够通过CNN运行它。如果我不对其进行评论,则image_batch似乎小于它应该是的batch_size是128,但image_batch.eval().shape可以小到8)。我认为这可能是由于线程不足,但增加inter_op_parallelism_threadsintra_op_parallelism_threads并不能解决这个问题。

1 个答案:

答案 0 :(得分:0)

jkschin是对的。图像阅读器的数量只有一个,因此num_threads 64不会改变它。由于image_batch无法足够快地填充,因此当image_batch出列并且它为空时,程序会过早停止。

解决此问题的正确方法是增加Reading Data中所述的图像阅读器(多个相同的子图)的数量。

image_list = [read_image(image_file_dequeue) for _ in range(num_readers)]
image_batch = tf.train.batch_join(image_list, ...)