将生成器与 tf.data 一起使用的最可扩展方式?tf.data 指南说`from_generator` 的可扩展性有限

San*_*ta7 12 python generator keras tensorflow tf.keras

tf.data 有一个from_generator初始值设定项,它似乎不可扩展。来自官方指南

注意:虽然这是一种方便的方法,但它的可移植性和可扩展性有限。它必须在创建生成器的同一个 python 进程中运行,并且仍然受 Python GIL 的约束。

https://www.tensorflow.org/guide/data#sumption_python_generators

并在官方文档中

注意:Dataset.from_generator() 的当前实现使用 tf.numpy_function 并继承相同的约束。特别是,它需要将与 Dataset 和 Iterator 相关的操作放置在与调用 Dataset.from_generator() 的 Python 程序相同的进程中的设备上。生成器的主体不会在 GraphDef 中序列化,如果您需要序列化模型并在不同的环境中恢复它,则不应使用此方法。

注意:如果生成器依赖于可变全局变量或其他外部状态,请注意运行时可能会多次调用生成器(以支持重复数据集)以及在调用 Dataset.from_generator() 和产生生成器的第一个元素。改变全局变量或外部状态可能会导致未定义的行为,我们建议您在调用 Dataset.from_generator() 之前在生成器中显式缓存任何外部状态。

https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator

然而,生成器是训练非常大量数据的一种相当常见的方法。所以必须有一些替代的最佳实践,但官方的 Tensorflow 数据指南没有提供任何信息。

Yao*_*ang 1

迭代生成器并将数据写入 TFRecord。然后使用 TFRecordDataset。这是指南。

https://www.tensorflow.org/tutorials/load_data/tfrecord

TF 旨在通过多 GPU 有效地使用这些类型的数据集。

将数据分片到磁盘还可以改善洗牌。