如何在 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
我最近迁移到 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