在太大而无法放入RAM的数据集上进行培训



我使用TensorFlow在一个非常大的数据集上进行训练,该数据集太大,无法放入RAM。因此,我在硬盘上将数据集拆分为多个碎片,并使用tf.data.Dataset类将碎片数据加载到GPU内存中的tf.placeholder中。为了跨越这些碎片进行训练,我正在考虑两种方法,但我不知道哪一种是最佳实践。它们是:

1( 对于每个epoch,依次加载每个数据集碎片,并在每个碎片上训练一次迭代。

2( 对于每个epoch,依次加载每个数据集碎片,然后在每个碎片上进行多次训练。

1(的问题是,从硬盘加载每个数据集碎片需要很长时间,而且由于每个碎片只在每次迭代中进行训练,因此总训练时间的很大一部分都花在了加载这些数据上。然而,2(的问题是,在同一个碎片上连续多次训练将使优化更有可能收敛到局部最小值。

建议采用哪种方法?

edit:使用新链接回答更新

Dataset类绝对是为太大而无法放入RAM的数据的用例而设计的。tf.data性能指南值得一读。

首先,我想看看在数据读取代码后战略性地使用预取+预取到数据集管道末端的设备是否有助于隐藏您的";提取";ETL过程的阶段。

我还建议打乱文件的加载顺序,并使用数据集打乱操作来避免您描述的局部最小值-理想情况下,示例也应该以随机顺序开始。如果您目前正在使用python代码加载数据,则可能值得考虑将数据预处理为例如TFRecord格式,以便您可以从TFRecordDataset的本地性能中获益。

有用的其他信息:

  1. 您是在单机上还是在集群上进行培训
  2. 数据格式是什么?您目前是如何加载的

最新更新