我看到了使用tensorflow训练cifar10数据的示例: Using Pandas to pd.read_excel() for multiple worksheets of the same workbook
代码使用tf.train.batch从多个单个图像生成一批图像 并使用prefetch_queue创建批处理队列。我明白有必要 在训练数据很大时使用队列预取数据。我想tf.train.batch坚持 内部队列(因为它有一个容量参数)。由于已经在tf.train.battch中维护了批次队列,因此需要创建 使用tf.contrib.slim.prefetch_queue的另一个队列? tf.contrib.slim.prefetch_queue到底做了什么?
cifar-10示例代码的关键部分如下所示:
import tensorflow as tf
images, labels = tf.train.batch(
[image, label],
batch_size=...,
num_threads=...,
capacity=...,
min_after_dequeue=...)
batch_queue = tf.contrib.slim.prefetch_queue.prefetch_queue(
[images, labels],
capacity=...)
答案 0 :(得分:3)
经过几个小时的研究,我想我可以回答我自己的问题。
tf.train.batch维护一个单帧图像池。当需要新批次(例如批量大小为n)时,tf.train.batch从池中获取n个项目并创建新批次。
prefetch_queue在内部维护一个队列。它接收从tf.train.batch创建的批处理并将其放入队列。
prefetch_queue和tf.train.batch的实现可以通过tensorboard进行可视化。
答案 1 :(得分:0)
我不确定您是否正确。根据文档here,tf.train.batch本身使用QueueRunner来保存数据,也就是说,tf.train.batch可以异步排队,您可以在不延迟的情况下直接从其队列中获取数据。您需要什么,为什么如果prefetch_queue仅维护队列,为什么必不可少?
我不太确定我所说的话,只是很少的建议,这些天我也在研究其机制。顺便说一句,tf.data.dataset的新API可能是更好的选择,我们无需担心它的实现。