我正在使用 TensorFlow 在一个非常大的数据集上进行训练,该数据集太大而无法放入 RAM。因此,我将数据集分割成硬盘上的多个分片,并使用该类tf.data.Dataset
将分片数据加载到tf.placeholder
GPU 内存中。为了跨这些碎片进行训练,我正在考虑两种方法,但我不知道哪一种是最佳实践。他们是:
1) 对于每个 epoch,依次加载每个数据集分片,并在每个分片上训练一次迭代。
2)对于每个epoch,依次加载每个数据集分片,然后在每个分片上训练多次。
1) 的问题是从硬盘加载每个数据集分片需要很长时间,并且由于每个分片仅在每次迭代中进行训练,因此整个训练时间的很大一部分都花在加载这些数据上。然而,2) 的问题在于,连续多次对同一分片进行训练将使优化更有可能收敛到局部最小值。
推荐的方法是什么?
编辑:用新链接回答更新。
Dataset 类绝对是为数据太大而无法容纳在 RAM 中的用例而设计的。tf.data 性能指南值得一读。
我首先会看看在数据读取代码之后策略性地使用预取+在数据集管道末尾预取到设备是否可以帮助隐藏 ETL 过程的“提取”阶段的延迟。
我还建议打乱文件加载的顺序,并使用数据集打乱操作来避免您描述的局部最小值 - 理想情况下,示例也应该以随机顺序开始。如果您当前使用 python 代码加载数据,则可能值得考虑将数据预处理为 TFRecord 格式,以便您可以受益于 TFRecordDataset 的本机性能。
有用的附加信息:
归档时间: |
|
查看次数: |
11791 次 |
最近记录: |