【问题标题】:Tensorflow: How to use the "new" Dataset API with QueueRunnerTensorflow:如何将“新”数据集 API 与 QueueRunner 一起使用
【发布时间】:2017-11-06 08:24:59
【问题描述】:

基本上我有一个要处理的图像列表。 而且我需要在加载后进行一些预处理(数据增强),然后馈送到 TF 的主图。 目前我正在使用一个定制的生成器,它采用路径列表产生一对张量(图像)并通过占位符馈送到网络。每个批次的顺序处理时间约为 0.5 秒。

我刚刚阅读了Dataset API,我可以通过.from_generator()函数直接使用它,我可以直接使用.get_next()作为输入。

但是QueueRunner 是如何融入框架的呢? Dataset 是否隐含地利用 queue + dequeue 来维护其 generator/get_next 管道,还是需要我之后显式地输入 FIFOQueue?如果答案是后一个,那么维护管道以训练+验证多个random_shuffle epoch 的最佳实践是什么? (我的意思是,我需要维护多少个DS/queueRunner,在哪里设置随机播放和历元?)

【问题讨论】:

  • 为了训练,我创建了两个数据集:一个用于训练,一个用于验证。您可以使用 Dataset API 设置纪元并打乱数据。我从来不需要使用 QueueRunner。
  • 我希望利用 QueueRunner 同时处理数据 (cpu) 和训练网络 (gpu) 来隐藏 cpu 时间。看来仅靠 Dataset 无法做到这一点,是吗?

标签: python tensorflow dataset


【解决方案1】:

如果您使用 Dataset API,则不必使用 QueueRunner 来拥有队列/缓冲区。可以使用 Dataset API 创建队列/缓冲区,并同时预处理数据和训练网络。如果您有数据集,则可以使用prefetch functionshuffle function 创建队列/缓冲区。

更多信息请查看official tutorial on the Dataset API

这是一个使用预取缓冲区和 CPU 预处理的示例:

 NUM_THREADS = 8
 BUFFER_SIZE = 100

 data = ...
 labels = ...
 inputs = (data, labels)

 def pre_processing(data_, labels_):
     with tf.device("/cpu:0"):
         # do some pre-processing here
         return data_, labels_

 dataset_source = tf.data.Dataset.from_tensor_slices(inputs)
 dataset = dataset_source.map(pre_processing, num_parallel_calls=NUM_THREADS)

 dataset = dataset.repeat(1)  # repeats for one epoch
 dataset = dataset.prefetch(BUFFER_SIZE)

 iterator = tf.data.Iterator.from_structure(dataset.output_types,
                                            dataset.output_shapes)
 next_element = iterator.get_next()
 init_op = iterator.make_initializer(dataset)

 with tf.Session() as sess:
     sess.run(init_op)
     while True:
         try:
             sess.run(next_element)
         except tf.errors.OutOfRangeError:
             break

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 2019-10-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多