4

我看到了一个使用 tensorflow 训练 cifar10 数据的例子: https ://github.com/tensorflow/models/tree/master/tutorials/image/cifar10

该代码使用 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=...)
4

2 回答 2

4

经过几个小时的研究,我想我可以回答我自己的问题。

tf.train.batch 维护一个单帧图像池。当需要一个新批次(例如批次大小为 n)时,tf.train.batch 从池中获取 n 个项目并创建一个新批次。

prefetch_queue 在内部维护一个队列。它接收从 tf.train.batch 创建的批次并将其放入队列中。

prefetch_queue 和 tf.train.batch 的实现可以通过 tensorboard 进行可视化。

于 2018-01-26T00:57:01.687 回答
0

我不确定你是否正确。根据此处的文档,tf.train.batch 本身使用 QueueRunner 来保存数据,也就是说,tf.train.batch 可以异步入队,您可以在需要时直接从其队列中获取数据而不会延迟,所以如果 prefetch_queue 只维护一个队列,为什么它是必不可少的?

我不太确定我说的是什么,只是一点建议,我这几天也在研究它的机制。顺便说一句,tf.data.dataset 的新 API 可能是一个更好的选择,我们不需要担心它的实现。

于 2018-07-17T05:23:32.843 回答