我对张量流中QueueRunner
的目的感到困惑。
阅读文档:https://www.tensorflow.org/programmers_guide/threading_and_queues
我正在编写自己的代码来从我的自定义数据库加载示例并将其加载到tensorflow中的队列。我已经定义了FIFOQueue
(我处理置换顺序)和相应的enqueue
操作。
Coordinator
有意义,我的代码使用它来知道何时关闭入队线程。但QueueRunner
的目的让我感到困惑。
QueueRunner
反复运行enqueue
操作。但是文档没有讨论如何将数据提供给该排队操作。
显然,入队操作需要你喂它 一些东西。因此,
QueueRunner
仅适用于您的情况 从tensorflow记录加载(例如,所有排队操作都是 他们自己在图中的操作)?
如果上述陈述是正确的,那么我理解(并希望文档是明确的)。在这种情况下,QueueRunner
不适合我在这种情况下使用,因为所有入队操作都不是图操作。如果我错了,请纠正我。
答案 0 :(得分:1)
你可以这样做:
def feed(images, labels, im, label, epochs=None):
epochs_elapsed = 0
while epochs is None or epochs_elapsed < epochs:
for i in range(len(images)):
yield {im: images[i], label: labels[i]}
epochs_elapsed += 1
def tf_ops(images, labels, capacity=128):
im = tf.placeholder(tf.float32,shape=(None,None,3))
label = tf.placeholder(tf.int32,shape=())
shapes = [(None,None,3), ()]
queue = tf.PaddingFIFOQueue(capacity, [tf.float32, tf.int32],shapes=shapes)
enqueue_op = queue.enqueue([im, label])
fqr = FeedingQueueRunner(queue, [enqueue_op],
feed_fns=[feed(images, labels,im, label).next()])
tf.train.add_queue_runner(fqr)
return queue.dequeue()
source_im,source_label = tf_ops(source_images,source_labels)
答案 1 :(得分:0)
经过这几次之后,我理解了这个场景,我在问题中的陈述是正确的。 QueueRunner只在循环中运行TF操作并处理内务处理。因此,在图中100%执行的任何加载操作(例如从TF数据文件读取)都将受益于QueueRunner,但如果您需要从tensorflow之外加载数据,则需要编写自己的线程并循环自己排队行动。