python - Tensorflow:如何将 "new"数据集 API 与 QueueRunner 一起使用

标签 python tensorflow dataset

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

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

但是 QueueRunner 如何融入框架呢? Dataset 是否隐式利用 queue + dequeue 来维护其 generator/get_next 管道,或者它需要我显式提供之后进入 FIFOQueue 吗?如果答案是后者,那么维护训练和验证多个 random_shuffle epoch 的管道的最佳实践是什么? (我的意思是,我需要维护多少个 DS/queueRunner,以及在哪里设置 shuffle 和 epoch?)

最佳答案

如果您使用数据集 API,则不必使用 QueueRunner 来拥有队列/缓冲区。可以使用数据集 API 创建队列/缓冲区,并同时预处理数据和训练网络。如果您有数据集,则可以使用 prefetch function 创建队列/缓冲区或shuffle 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

关于python - Tensorflow:如何将 "new"数据集 API 与 QueueRunner 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47132557/

相关文章:

python - 如何在 Python 中将简单字符串转换为 int( Pyramid )

python - Keras 中 Inception V3 的自定义 input_shape 如何工作?

python - 如何使用 TensorFlow 在 Returnn 中加载经过训练的网络的权重

r - 在 R 中创建子集数据的二分搜索类似概念

python - PyTorch:用 GPU 训练比用 CPU 训练同样的东西会产生更严重的错误

python - 检查一对值是否在 Pandas 的一对列中

python - 如何从 PyTorch 中的数据加载器获取整个数据集

python - 防止 Predict_generator 打乱批处理

vb.net - 避免在每列上检查 DataRow.IsDBNull 吗?

api - 如何将太大的 Kaggle 数据集的一个选定文件从 Kaggle 加载到 Colab 中