如何在 TensorFlow 中混合基于队列和基于提要的输入

How to mix queue-based and feed-based input in TensorFlow

我最近迁移到 fully_connected 样式模型,该模型从 TFRecords 文件生成的队列中读取输入。这已被证明效率更高,但我仍然想通过 placeholder/feed_dict.

交互传递参数

有没有办法对 feed_dict 和 full_connected 功能使用相同的计算图(假设您有一个模型 class 在 init 方法中构建图) ?你能得到一个占位符来接收来自出队的值吗?

一种可能性是使用最近添加的(在 TensorFlow 0.8 中)tf.placeholder_with_default() op,它允许您指定默认值(通常是 queue/reader 的输出),并且还允许您提供可能具有不同形状的值。

例如,假设您的队列生成 32 个元素的批次,其中每个元素具有 784 个特征,从而给出一个 32 x 784 矩阵。

input_from_queue = ...  # e.g. `queue.dequeue_many(32)` or `tf.train.batch(..., 32)`
# input_from_queue.get_shape() ==> (32, 784)

input = tf.placeholder_with_default(input_from_queue, shape=(None, 784))
# input.get_shape() ==> (?, 784)

# ...
train_op = ...

sess.run(train_op)  # Takes examples from `queue`.
sess.run(train_op, feed_dict={input: ...})  # Takes examples from `feed_dict`.

这允许您根据需要以可变大小的批次或使用输入 reader。

您可以简单地提供出列操作的输出。 TensorFlow 实际上不会使任何项目出列,它只会使用您提供的值。例如:

q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], shapes=[()])
v = tf.placeholder(tf.float32)
enqueue = q.enqueue([v])
dequeue = q.dequeue()
output = dequeue + 10.0

with tf.Session() as sess:
    sess.run(enqueue, feed_dict={v: 1.0})
    sess.run(enqueue, feed_dict={v: 2.0})
    sess.run(enqueue, feed_dict={v: 3.0})
    print(sess.run(output)) # 11.0
    print(sess.run(output, feed_dict={dequeue: 5.0})) # 15.0
    print(sess.run(output)) # 12.0
    print(sess.run(output)) # 13.0