如何将张量推送到TensorFlow队列并从另一个进程中拉出它们?

时间:2016-08-28 21:58:34

标签: queue tensorflow

我已经启动并运行了TensorFlow群集,并且我正在尝试使用一个客户端进程将数据排入队列,并将其从另一个进程中出列。我不能让这个工作,我做错了什么?

这是推送数据的程序:

# queue_push.py
import tensorflow as tf
import time

with tf.container("qtest"):
    q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32],
                     shapes=[[]], name="q")
    v = tf.placeholder(tf.float32, shape=())
    enqueue = q.enqueue([v])

with tf.Session("grpc://localhost:2210") as sess:
    while True:
        t = time.time()
        print(t)
        sess.run(enqueue, feed_dict={v: t})
        time.sleep(1)

我的程序来提取数据:

# queue_pull.py
import tensorflow as tf
import time

with tf.container("qtest"):
    q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32],
                     shapes=[[]], name="q")
    dequeue = q.dequeue()

with tf.Session("grpc://localhost:2222") as sess:
    while True:
        v = sess.run(dequeue)
        print("Pulled:", v)
        time.sleep(0.5)

当我运行它们时,这就是我得到的:

$ python queue_push.py
1472420887.974484
1472420888.991067
1472420889.995756
1472420890.998365
1472420892.001799
1472420893.008567
1472420894.011109
1472420895.014532
1472420896.02017
1472420897.024806
1472420898.03187
(then blocked forever)

并行:

$ python queue_pull.py
(blocked forever)

1 个答案:

答案 0 :(得分:5)

要在多个会话之间共享tf.FIFOQueue(或其他TensorFlow队列),您需要将可选的shared_name参数传递给constructor,并在每个会话中将其设置为相同的字符串实例。例如,您可以在两个脚本中创建q,如下所示:

q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], shapes=[[]],
                 shared_name="shared_q", name="q")

shared_name不必与队列的name相同,但它必须在同一设备上的同一容器中创建的所有其他队列中唯一。您可以在不使用with tf.container():块的情况下共享队列; tf.container()块提供了一种对有状态对象进行分组的方法,以便可以有选择地清除它们(使用tf.Session.reset())。

N.B。 tf.Variable个对象的默认共享行为不同,基于name属性默认共享。否则,只有在构造函数中设置shared_name参数时才会共享TensorFlow图中的所有共享对象(队列,读取器等)。