我有一个带图像的目录和另一个带有标签文件的目录(对于每个图像)。我正在尝试使用队列和读取操作来读取图像和标签。
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_threads
和intra_op_parallelism_threads
并不能解决这个问题。
答案 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, ...)