TF Dataset API:以下顺序是不是正确?地图、缓存、随机播放、批处理、重复、预取

Posted

技术标签:

【中文标题】TF Dataset API:以下顺序是不是正确?地图、缓存、随机播放、批处理、重复、预取【英文标题】:TF Dataset API: Is the following sequence correct? map,cache,shuffle,batch,repeat,prefetchTF Dataset API:以下顺序是否正确?地图、缓存、随机播放、批处理、重复、预取 【发布时间】:2018-12-31 07:38:11 【问题描述】:

我正在使用此序列从磁盘读取图像文件并输入 TF Keras 模型。

  #Make dataset for training
    dataset_train = tf.data.Dataset.from_tensor_slices((file_ids_training,file_names_training))
    dataset_train = dataset_train.flat_map(lambda file_id,file_name: tf.data.Dataset.from_tensor_slices(
        tuple (tf.py_func(_get_data_for_dataset, [file_id,file_name], [tf.float32,tf.float32]))))
    dataset_train = dataset_train.cache()

    dataset_train= dataset_train.shuffle(buffer_size=train_buffer_size)
    dataset_train= dataset_train.batch(train_batch_size) #Make dataset, shuffle, and create batches
    dataset_train= dataset_train.repeat()
    dataset_train = dataset_train.prefetch(1)
    dataset_train_iterator = dataset_train.make_one_shot_iterator()
    get_train_batch = dataset_train_iterator.get_next()

我对这是否是最佳序列有疑问。 例如repeat 应该在shuffle() 之后batch() 之前吗?cache() 应该在batch 之后吗?

【问题讨论】:

非常感谢@mrry 或其他人的澄清。具体来说,我想知道在 .batch 方法之前和之后保持重复之间的区别。例如,如果我在 .batch 之后保留 .repeat,它会重复洗牌批次还是重复洗牌数据? 我也想知道命令如何影响命令。例如,prefetch 根据出现的顺序预取什么。如果我会执行.batch().prefetch(2),这是否意味着预取了 2 个批次或仍然是 2 个样本? (这只是一个示例,我正在为所有重要顺序中的所有命令寻求一般解释)。 我个人没有在当前接受的答案中看到您的问题得到回答。只要它保持“已回答”状态,我就不会看到像 @mrry 这样的人进来并添加完整的答案。 [TF 2.0 文档] (tensorflow.org/versions/r2.0/api_docs/python/tf/data/…) 注意:与其他 Dataset 方法一样,prefetch 对输入数据集的元素进行操作。它没有示例与批次的概念。 examples.prefetch(2) 将预取两个元素(2 个示例),而 examples.batch(20).prefetch(2) 将预取 2 个元素(2 个批次,每个批次 20 个示例)。 【参考方案1】:

Output differences when changing order of batch(), shuffle() and repeat() 的答案建议在批处理之前重复或随机播放。我经常使用的顺序是(1)随机播放,(2)重复,(3)映射,(4)批处理,但它可以根据您的喜好而有所不同。我在重复之前使用 shuffle 以避免模糊时代边界。我在批处理之前使用 map,因为我的映射函数适用于单个示例(而不是批处理示例),但是您当然可以编写一个矢量化的 map 函数,并希望将批处理视为输入。

【讨论】:

谁能指出一个经过矢量化并将批次作为输入的地图示例? 请注意这是否回答了您的问题@maurice,但 tf.data.experimental.unbatch() 适用于整个数据集,因此在某种意义上矢量化:dataset.apply(tf.data.experimental .unbatch())

以上是关于TF Dataset API:以下顺序是不是正确?地图、缓存、随机播放、批处理、重复、预取的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:如何查找 tf.data.Dataset API 对象的大小

如何使用 DataSet API 在 Tensorflow 中为 tf.train.SequenceExample 数据创建填充批次?

如何使用 TF1.3 中的新 Dataset api 映射具有附加参数的函数?

如何更改 tf.data.Dataset 中数据的 dtype?

Tensorflow:连接多个tf.Dataset非常慢

tf.data.Dataset.from_tensor_slices() 详解