【问题标题】:Question about creating a Tensorflow Dataset from data that is too big for RAM (with shuffling)关于从对 RAM 来说太大的数据创建 Tensorflow 数据集的问题(使用改组)
【发布时间】:2019-06-08 21:08:39
【问题描述】:

我有 60 GB 的 .npy 文件分布在 20 个文件中。我想在tensorflow 中建立一个神经网络来学习这些数据。

我计划训练 19 个文件以便测试 1 个文件。每个文件大约有 80 列 x 数据和 1 列分类 y 数据。数据类型为np.float64np.int64。我不能将数据类型减少到更小的大小,因为我会在舍入错误中丢失有价值的数据。

我在加载单个文件时将数据加载到我的神经网络中没有问题,但我在训练时遇到了问题,因为我需要学习所有数据。我无法按顺序学习文件(例如,按 1、2、3、...、19 的顺序训练文件 1-19)。我需要以某种方式对每个时期的 所有 数据进行洗牌。

我读过像this one 这样的帖子,看起来和我的问题几乎一模一样。但是,我的问题不同,因为我需要在多个文件之间进行随机播放。我还没有看到在stackoverflow上回答过这样的问题。

【问题讨论】:

  • 据我所知,您有几个选择:1)从 1-19 随机选择文件(无需替换)以获得一些随机洗牌 2)预先洗牌文件(例如,混合 2 个文件的辅助函数(3, 15), (5, 10), ...)。将更多的改组堆叠在一起以获得更多改组 3)将数据集分解为更多文件,例如 100 个文件而不是 20 个文件。有什么理由你没有尝试过吗? 4)使用tf.data.TfRecords(在链接的问题中提到过)。这行不通吗?为什么不呢?
  • 也许您可以使用interleaveparallel_interleave 使用tf 数据管道。在这种情况下,您的周期长度可能是 20。您可以使用from_generator 定义一个生成器,该生成器对每个文件中的数据进行混洗并产生混洗数据,并在此之上应用带有 num_parallel_calls 参数的 interleave 或带有 sloppy 参数的 parallel_interleave

标签: python numpy tensorflow


【解决方案1】:

您链接到的帖子解释了如何为 19 个数据文件中的每一个获取 TFRecordDataset。然后您可以使用 tf.data.Dataset.zip 将 TfRecordDatasets 组合成一个数据集。在此数据集上,您可以应用 shuffle。有关详细信息,请参阅此tensorflow tutorial

shuffle tf.data.Dataset 的工作方式是加载数据缓冲区并对其进行混洗。一旦它被消耗,下一个缓冲区大小的数据块就会被加载和洗牌。我想如果需要,您可以通过将 19 个文件分成更小的文件来增加随机性,但您会付出计算效率的代价。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2016-03-25
    相关资源
    最近更新 更多