【问题标题】:How to feed multiple NumPy arrays to a deep learning network in Keras?如何将多个 NumPy 数组提供给 Keras 中的深度学习网络?
【发布时间】:2019-01-12 19:53:36
【问题描述】:

我有大约 13 个 NumPy 数组作为文件存储在磁盘上,大约需要 24 GB。每个文件用于单个主题,由两个数组组成:一个包含输入数据(二维矩阵列表,行表示连续时间),另一个包含数据标签。

我的最终目标是将所有数据提供给我用 Keras 编写的深度学习网络,以对新数据进行分类。但是我不知道如何在内存不足的情况下执行此操作。

我已阅读有关 Keras 的数据生成器的信息,但找不到适合我的情况的方法。

我也查过 HDF5 和 h5py,但我不知道如何在不耗尽内存的情况下将所有数据添加到单个数组(HDF5 中的数据集)。

【问题讨论】:

  • 数据是图片还是其他?标签是什么?是简单的分类任务还是别的什么?
  • @Djib2011 这是脑电图数据,列是不同的电极,而行代表大脑信号通过时间。所以基本上它是时间序列数据。至于任务,是分类任务。
  • 我相信你知道,regular 方法是将所有内容加载到一个大的 numpy 数组中并从中训练模型。由于数据的大小使这成为不可能,因此您不得不使用生成器将数据馈送到网络中。但是,我不知道有任何简单的方法可以这样做;我的建议涉及创建您自己的自定义生成器,不幸的是,这需要大量的编码和调试。如果您有兴趣,我可以写一个答案,为您提供一些关于如何做到这一点的指示......也许有人有更好的主意。
  • @Djib2011 如果你能写一个答案,我将不胜感激。
  • @Djib2011 非常感谢 :)

标签: python numpy keras hdf5


【解决方案1】:

您需要做的是实现一个生成器,将数据一点一点地提供给您的模型。 Keras,确实有一个TimeseriesGenerator,但我认为你不能使用它,因为它需要你首先将整个数据集加载到内存中。值得庆幸的是,keras 有一个图像生成器(称为ImageDataGenerator),我们将使用它来作为我们自定义生成器的基础。

关于它如何工作的前两个词。您有两个主要课程 ImageDataGenerator 课程 (主要处理您想要对每个图像执行的任何预处理)和 DirectoryIterator 类,它实际上完成了所有工作。后者是我们将修改以获得我们想要的东西。它的本质是:

  • 继承自keras.preprocessing.image.Iterator,它实现了许多初始化和生成名为index_array 的数组的方法,该数组包含每批中使用的图像的索引。这个数组在每次迭代中都会改变,而它从中提取的数据在每个时期都会被打乱。我们将在此基础上构建我们的生成器,以维护其功能。
  • 搜索目录下的所有图像;标签是从目录结构中推导出来的。它将每个图像的路径及其标签存储在两个分别称为filenamesclasses 的类变量中。我们将使用这些相同的变量来存储时间序列及其类的位置。
  • 它有一个名为_get_batches_of_transformed_samples() 的方法,该方法接受index_array,加载索引对应于数组索引的图像,并返回一批这些图像和一个包含它们的类的图像。

我建议你做的是:

  1. 编写一个脚本来构建时间序列数据,就像使用 ImageDataGenerator 时应该如何构建图像一样。这包括为每个类创建一个目录,并将每个时间序列分开放在这个目录中。虽然这可能需要比当前选项更多的存储空间,但在训练模型时不会将数据加载到内存中。
  2. 了解DirectoryIterator 的工作原理。
  3. 定义您自己的生成器类(例如MyTimeseriesGenerator)。确保它继承来自上述Iterator 类。
  4. 修改它以搜索您想要的文件格式(例如 HDF5npy)而不是图像格式(例如 png , jpeg) 就像现在一样。这是在 1733-1763 行中完成的。您不需要让它像 keras 的 DirectoryIterator 那样在多个线程上工作,因为这个过程只完成一次
  5. 更改_get_batches_of_transformed_samples() 方法,使其读取您想要的文件类型,而不是读取图像(第1774-1788 行)。 删除 DirectoryIterator 具有的任何其他与图像相关的功能(转换图像、标准化图像、保存图像等)
  6. 确保上述方法返回的数组与您希望模型接受的数组相匹配。我猜它应该在 (batch_size, n_timesteps)(batch_size, n_timesteps, n_feature) 的行中,用于数据,(batch_size, n_classes) 用于标签。

就是这样!听起来比实际上更难。一旦您熟悉了 DirectoryIterator 类,其他一切都变得微不足道。

预期用途(修改代码后):

from custom_generator import MyTimeseriesGenerator  # assuming you named your class 
                                                    # MyTimeseriesGenerator and you
                                                    # wrote it in a python file 
                                                    # named custom_generator

train_dir = 'path/to/your/properly/structured/train/directory'
valid_dir = 'path/to/your/properly/structured/validation/directory'

train_gen = MyTimeseriesGenerator(train_dir, batch_size=..., ...)
valid_gen = MyTimeseriesGenerator(valid_dir, batch_size=..., ...)

# instantiate and compile model, define hyper-parameters, callbacks, etc.

model.fit_generator(train_gen, validation_data=valid_gen, epochs=..., ...) 

【讨论】:

  • 出于好奇,有谁知道tensorflow数据模块是否可以处理?
  • 可以,但是自从我写了这篇评论之后,TensorFlow 引入了一个 tf.data.Dataset 类,可以用来提供你的数据。
猜你喜欢
  • 2020-12-31
  • 2018-01-09
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多