将forync io的队列与tensorflow中的auto enqueue组合在一起

时间:2016-11-07 21:18:27

标签: queue tensorflow pipeline

我有多个包含功能的csv文件。一个功能是图像的文件名。我想逐行读取csv文件,将相应图像的路径推送到新队列中。两个队列都应该并行处理。

flow

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)以避免死锁并允许批处理?

2 个答案:

答案 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()操作(产生keybuffer)将会阻止,直到将某些内容添加到队列中。在TensorFlow中,这通常通过创建tf.train.QueueRunner来实现,tutorial on threading and queues定义了一组可以在后台线程中运行的操作,以便将元素移动到队列中。有关详细信息,请参阅TensorFlow中的PRIMARY KEY and UNIQUE Index Constraints