tf.contrib.slim.prefetch_queue在tensorflow中做了什么

时间:2018-01-25 03:27:27

标签: tensorflow-slim

我看到了使用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=...)

2 个答案:

答案 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可能是更好的选择,我们无需担心它的实现。