为什么这个包含2个队列运行程序的代码段会挂起

时间:2017-03-06 20:04:36

标签: tensorflow

我有2个队列,一个用于文件名,一个用于保存这些文件名的内容。 tf.train.string_input_producer会自动添加QR。我添加了一个QR用于排队第二个队列。但是这段代码挂了,任何能让我弄明白我缺少的建议都值得赞赏。

with tf.Session(graph=tf.Graph(), config=tf.ConfigProto(inter_op_parallelism_threads=4,
                                                        intra_op_parallelism_threads=2)) as sess:

    images, bottlenecks = tf.import_graph_def(graph_def, return_elements=[IMAGE_BATCH, BOTTLENECKS])

    file_name_queue = tf.train.string_input_producer(file_names, num_epochs=1, shuffle=False)
    image_queue = tf.FIFOQueue(1024,
                               [tf.float32],
                               [tf.TensorShape([image_size, image_size, 3])])

    reader = tf.WholeFileReader()
    _, contents = reader.read(file_name_queue)

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

    enqueue_op = image_queue.enqueue(image)

    coord = tf.train.Coordinator()

    tf.train.QueueRunner(image_queue, [enqueue_op] * 2)

    sess.run(tf.group(tf.local_variables_initializer(), tf.global_variables_initializer()))

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

    while not coord.should_stop():
        image_batch = image_queue.dequeue_many(batch_size).eval()
        print()
        bottleneck_batch = bottlenecks.eval(feed_dict={
            images: np.stack(image_batch)
        })

编辑:经过一些实验,我发现第一个QR运行但不是第二个。

1 个答案:

答案 0 :(得分:0)

队列运行器未隐式添加到tf.GraphKeys.QUEUE_RUNNERS。使用QueueRunner

添加您创建的任何tf.train.add_queue_runner

这应该解决它:

qr = tf.train.QueueRunner(image_queue, [enqueue_op] * 2)
tf.train.add_queue_runner(qr)

现在调用tf.train.start_queue_runners也将启动此队列运行器(qr)。