首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用h5py将数据追加到hdf5文件中的一个特定数据集

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

Stack Overflow用户
提问于 2017-11-02 18:23:34
回答 2查看 43.8K关注 0票数 56

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

对我的项目做一个简短的介绍:我尝试使用医学图像数据来训练CNN。由于在将数据转换为NumPy数组的过程中需要使用大量数据和大量内存,因此我需要将“转换”拆分为几个数据块:加载并预处理前100个医学图像,将NumPy数组保存到hdf5文件,然后加载下100个数据集并附加现有的.h5文件,依此类推。

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

代码语言:javascript
复制
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文件中的现有dataset中:这意味着我希望将下一个100个X_train数组追加到现有的[100, 512, 512, 9]形状的NumPy数据集,这样X_train就会变成[200, 512, 512, 9]形状。这同样适用于其他三个数据集X_testY_trainY_test

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-02 19:48:09

我找到了一个似乎有效的解决方案!

看看这个:incremental writes to hdf5 with h5py

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

因此,解决方案如下所示:

代码语言:javascript
复制
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,)创建数据集,例如

代码语言:javascript
复制
h5f.create_dataset('X_train', data=orig_data, compression="gzip", chunks=True, maxshape=(None,)) 

否则,数据集将无法扩展。

票数 59
EN

Stack Overflow用户

发布于 2021-04-30 20:46:33

@Midas.Inc answer工作得很好。仅为感兴趣的人提供一个最小的工作示例:

代码语言:javascript
复制
import numpy as np
import h5py

f = h5py.File('MyDataset.h5', 'a')
for i in range(10):

  # Data to be appended
  new_data = np.ones(shape=(100,64,64)) * i
  new_label = np.ones(shape=(100,1)) * (i+1)

  if i == 0:
    # Create the dataset at first
    f.create_dataset('data', data=new_data, compression="gzip", chunks=True, maxshape=(None,64,64))
    f.create_dataset('label', data=new_label, compression="gzip", chunks=True, maxshape=(None,1)) 
  else:
    # Append new data to it
    f['data'].resize((f['data'].shape[0] + new_data.shape[0]), axis=0)
    f['data'][-new_data.shape[0]:] = new_data

    f['label'].resize((f['label'].shape[0] + new_label.shape[0]), axis=0)
    f['label'][-new_label.shape[0]:] = new_label

  print("I am on iteration {} and 'data' chunk has shape:{}".format(i,f['data'].shape))

f.close()

代码输出:

代码语言:javascript
复制
#I am on iteration 0 and 'data' chunk has shape:(100, 64, 64)
#I am on iteration 1 and 'data' chunk has shape:(200, 64, 64)
#I am on iteration 2 and 'data' chunk has shape:(300, 64, 64)
#I am on iteration 3 and 'data' chunk has shape:(400, 64, 64)
#I am on iteration 4 and 'data' chunk has shape:(500, 64, 64)
#I am on iteration 5 and 'data' chunk has shape:(600, 64, 64)
#I am on iteration 6 and 'data' chunk has shape:(700, 64, 64)
#I am on iteration 7 and 'data' chunk has shape:(800, 64, 64)
#I am on iteration 8 and 'data' chunk has shape:(900, 64, 64)
#I am on iteration 9 and 'data' chunk has shape:(1000, 64, 64)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47072859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档