【问题标题】:How to efficiently save and load dataset with h5py?如何使用 h5py 有效地保存和加载数据集?
【发布时间】:2019-10-28 12:50:05
【问题描述】:

我有一个大小为(900, 200, 308, 311, 1) 的数据集,其中每个样本中有200 图像,每个维度为308x311。我从这个数据集中创建了一个h5py 文件(dtype:float),结果大约是125GB(比实际数据大得多)。

数据创建过程本身需要大量时间。我就是这样做的:

input = []
# 900 samples
for sample in dataset:
    sequence = []
    # 200 images/sample
    for file in images:
        img = #read file
        sequence.append(img)
    input.append(sequence)
input = np.array(input).reshape(900, 200, 308, 311, 1)

with h5py.File('X.h5py', 'w') as f:
    d = f.create_dataset('X', data=input, dtype='float')

当我加载这个文件时,再次将数据加载到内存中需要很长时间

f = h5py.File("X.h5py","r")
X = np.array(f['X'])

有没有一种有效的方法来存储和加载这么大的数据。我已经看到chunking 的数据,但我不确定这样做是否有帮助。另外,如果我将数据存储在块中,我可以从数据中加载一个样本而不是像以前那样的块吗?

【问题讨论】:

  • 不要想要这样做:X = np.array(f['X'])(除非你必须这样做)。您正在将整个 X 数据集读入一个数组。您可以使用 numpy 切片来获取数据的子集(一次 1 张图像)。如果我了解您的数据布局,您可以像这样从 1 个样本中切出 1 个图像: image_data = np.array(f['X'][sample#, image#, :, :, :])
  • 你为什么使用 float dtype?通常图像使用 8 位 UInt,它比浮点数小得多。这些图像是彩色的吗?如果是这样,我会期望另一个尺寸为 3 的尺寸?图片是什么格式的? I/O 可能是导致速度变慢的主要原因,尽一切可能使数据变小有助于提高速度。
  • @kcw78 谢谢,我会试试这个。如果我想要一个数据流,例如 PyTorch 的数据加载器怎么办?
  • @farenorth 这些图像是 16 位灰度值。我存储在 float 中的原因是因为标准化。
  • 我没有使用过 PyTorch,所以我无法回答这个问题。此外,您不需要上面的np.array()。这足以获得 NumPy 数组:image_data = f['X'][sample#, image#, :, :, :]

标签: python numpy h5py


【解决方案1】:

我做了两件事来加快存储和加载速度

  1. 我没有将图像附加为矩阵,而是使用了扁平向量。
  2. 我以一种不再需要使用float 的方式对数据进行了标准化。

这两件事导致将数据保存在(#samples, #time_steps, #pixels) 的维度中。然后我在加载 h5py 文件后重新塑造了 numpy 数组。

结果:更少的内存消耗和更快的访问时间。

感谢@kcw8 提到切片。当我想在不加载整个数据集的情况下生成数据子集时,它也很有帮助。

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多