我有多个包含功能的csv文件。一个功能是图像的文件名。我想逐行读取csv文件,将相应图像的路径推送到新队列中。两个队列都应该并行处理。
csv_queue = tf.FIFOQueue(10, tf.string)
csv_init = csv_queue.enqueue_many(['sample1.csv','sample2.csv','sample3.csv'])
path, label = read_label(csv_queue)
image_queue = tf.FIFOQueue(100, tf.string)
image_init = image_queue.enqueue(path)
_, image = read_image(image_queue)
with tf.Session() as sess:
csv_init.run()
image_init.run()
print(sess.run([key, label, path])) # works
print(sess.run(image)) # works
print(sess.run([key, label, path])) # works
print(sess.run(image)) # will deadlock unlike I do iq_init.run()
可以找到辅助函数(例如read_csv
)的实现here
我可以"隐藏"在iq_init.run()
后面调用sess.run(image)
以避免死锁并允许批处理?
答案 0 :(得分:1)
filenames = ['./cs_disp_train.txt', './cs_limg_train.txt']
txt_queue = tf.train.string_input_producer(filenames)
# txt_queue = tf.FIFOQueue(10, tf.string)
# init_txt_queue = txt_queue.enqueue_many(filenames)
enqueue_ops = []
image_queues = tf.FIFOQueue(100, tf.string)
num_reader = len(filenames)
for i in range(num_reader):
reader = tf.TextLineReader()
_, buffer = reader.read(txt_queue)
enqueue_ops.append(image_queues.enqueue(buffer))
tf.train.queue_runner.add_queue_runner(
tf.train.queue_runner.QueueRunner(image_queues, enqueue_ops))
y = image_queues.dequeue()
sess = tf.Session()
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# sess.run(init_txt_queue)
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
print sess.run([y])
coord.request_stop()
coord.join(threads)
例如,我有两个文件,' cs_disp_train.txt'和&#cs_limg_train.txt',一个用于深度图像'文件地址,另一个是相应的彩色图像'地址。代码创建两个FIFOQueues,一个读取这两个文件,另一个读取所有文件名。
我也在使用tf.train.QueueRunner。但我不确定我是否理解它。我从here获得了灵感,虽然它读取了TFRecords文件。希望这可以帮助你。
答案 1 :(得分:0)
第二次调用sess.run()
时出现死锁,因为image_queue
为空,而reader.read()
操作(产生key
和buffer
)将会阻止,直到将某些内容添加到队列中。在TensorFlow中,这通常通过创建tf.train.QueueRunner
来实现,tutorial on threading and queues定义了一组可以在后台线程中运行的操作,以便将元素移动到队列中。有关详细信息,请参阅TensorFlow中的PRIMARY KEY and UNIQUE Index Constraints。