我有一个包含图像的目录和另一个包含标签文件的目录(对于每个图像)。我正在尝试使用队列和读取操作读取图像和标签。
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
不能解决这个问题。
jkschin 是对的。图像阅读器的数量只有一个,num_threads
64 个不会改变这一点。并且由于image_batch
不能足够快地填充,程序在image_batch
出队且为空时过早停止。
解决这个问题的正确方法是增加图像阅读器的数量(多个相同的子图),如阅读数据中所述。
image_list = [read_image(image_file_dequeue) for _ in range(num_readers)]
image_batch = tf.train.batch_join(image_list, ...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句