我正在使用TensorFlow在非常大的数据集上进行训练,该数据集太大而无法放入RAM。因此,我已将数据集拆分为硬盘上的多个分片,并且使用tf.data.Dataset
类将分片数据加载到GPU内存中的tf.placeholder
中。为了训练这些碎片,我正在考虑两种方法,但是我不知道哪种方法是最佳实践。他们是:
1)对于每个时期,依次加载每个数据集分片,并在每个分片上训练一次迭代。
2)对于每个时期,依次加载每个数据集分片,然后对每个分片进行多次训练。
1)的问题是从硬盘驱动器加载每个数据集碎片需要很长时间,并且由于每个碎片仅在每次迭代中进行训练,因此花费了整个训练时间的很大一部分来加载此数据。但是,2)的问题在于,连续对同一分片进行多次训练将使优化更有可能收敛到局部最小值。
推荐哪种方法?
答案 0 :(得分:0)
Dataset类绝对是为数据量太大而无法放入RAM的用例设计的。如果您还没有看过该性能指南,则值得阅读:https://www.tensorflow.org/performance/datasets_performance
首先,我要看看在数据集管道末尾的数据读取代码+ prefetch之后对prefetch to device的策略性使用是否可以帮助掩盖ETL过程“提取”阶段的延迟
我还建议改组文件的加载顺序,并使用数据集改组操作来避免您描述的局部最小值-理想情况下,示例也应以随机顺序开始。如果您当前正在使用python代码加载数据,则可能值得考虑将数据预处理为例如TFRecord格式,以便您可以受益于TFRecordDataset的本机性能。
有用的其他信息: