gpt4 book ai didi

python - 如何将多个 NumPy 数组提供给 Keras 中的深度学习网络?

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:46 25 4
gpt4 key购买 nike

我有大约 13 个 NumPy 数组存储为文件,在磁盘上占用大约 24 GB 的空间。每个文件针对单个受试者,由两个数组组成:一个包含输入数据(二维矩阵列表,行表示连续时间),另一个包含数据标签。

我的最终目标是将所有数据提供给我用 Keras 编写的深度学习网络,以对新数据进行分类。但我不知道如何在不耗尽内存的情况下做到这一点。

我读过 Keras 的数据生成器,但找不到适合我的情况的方法。

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

最佳答案

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

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

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

我建议你做的是:

  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=..., ...)

关于python - 如何将多个 NumPy 数组提供给 Keras 中的深度学习网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51697727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com