如何使用h5py将数据附加到hdf5文件中的一个特定数据集

2024-10-17 08:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找使用Python(h5py)将数据附加到.h5文件中现有数据集中的可能性。

我的项目简介:我试着用医学图像数据训练CNN。由于数据到NumPy数组转换过程中数据量大,内存占用大,所以需要将“转换”拆分成几个数据块:加载前100幅医学图像并进行预处理,将NumPy数组保存到hdf5文件中,然后加载下100个数据集并追加现有的.h5文件,等等。

现在,我尝试存储前100个转换后的NumPy数组,如下所示:

import h5py
from LoadIPV import LoadIPV

X_train_data, Y_train_data, X_test_data, Y_test_data = LoadIPV()

with h5py.File('.\PreprocessedData.h5', 'w') as hf:
    hf.create_dataset("X_train", data=X_train_data, maxshape=(None, 512, 512, 9))
    hf.create_dataset("X_test", data=X_test_data, maxshape=(None, 512, 512, 9))
    hf.create_dataset("Y_train", data=Y_train_data, maxshape=(None, 512, 512, 1))
    hf.create_dataset("Y_test", data=Y_test_data, maxshape=(None, 512, 512, 1))

可以看到,转换后的NumPy数组被分成四个不同的“组”,这些“组”存储在四个hdf5数据集[X_train, X_test, Y_train, Y_test]中。 LoadIPV()函数执行医学图像数据的预处理。

我的问题是,我想将下一个100个NumPy数组存储到同一个.h5文件中的现有数据集中:这意味着我想将下一个100个NumPy数组附加到形状[100, 512, 512, 9]的现有X_train数据集中,这样X_train就变成形状[200, 512, 512, 9]。其他三个数据集X_testY_trainY_test也应该如此。


Tags: 文件数据testnumpynonedatacreatetrain
1条回答
网友
1楼 · 发布于 2024-10-17 08:37:20

我找到了一个可行的解决方案!

看看这个:incremental writes to hdf5 with h5py

为了将数据追加到特定的数据集,必须首先在相应的轴上调整特定数据集的大小,然后在“旧”n数组的末尾追加新数据。

因此,解决方案如下:

with h5py.File('.\PreprocessedData.h5', 'a') as hf:
    hf["X_train"].resize((hf["X_train"].shape[0] + X_train_data.shape[0]), axis = 0)
    hf["X_train"][-X_train_data.shape[0]:] = X_train_data

    hf["X_test"].resize((hf["X_test"].shape[0] + X_test_data.shape[0]), axis = 0)
    hf["X_test"][-X_test_data.shape[0]:] = X_test_data

    hf["Y_train"].resize((hf["Y_train"].shape[0] + Y_train_data.shape[0]), axis = 0)
    hf["Y_train"][-Y_train_data.shape[0]:] = Y_train_data

    hf["Y_test"].resize((hf["Y_test"].shape[0] + Y_test_data.shape[0]), axis = 0)
    hf["Y_test"][-Y_test_data.shape[0]:] = Y_test_data

但是,请注意,您应该使用maxshape=(None,)创建数据集,例如

h5f.create_dataset('X_train', data=orig_data, compression="gzip", chunks=True, maxshape=(None,)) 

否则无法扩展数据集。

相关问题 更多 >