Как добавить данные в один конкретный набор данных в файле hdf5 с h5py

Я ищу возможность добавить данные в существующий набор данных в файле .h5 с помощью Python (h5py).

Краткое введение в мой проект: я пытаюсь обучить 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 в существующих наборах данных: это означает, что я хотел бы добавить, например, существующий набор данных X_train формы [100, 512, 512, 9] со следующими 100 массивами NumPy, так что X_train приобретает форму [200, 512, 512, 9]. То же самое должно работать для других трех наборов данных X_test, Y_train и Y_test.

Ответ 1

Я нашел решение, которое, кажется, работает!

Взгляните на это: инкрементная запись в hdf5 с помощью h5py!

Чтобы добавить данные в определенный набор данных, необходимо сначала изменить размер определенного набора данных на соответствующей оси, а затем добавить новые данные в конце "старого" nparray.

Таким образом, решение выглядит так:

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

в противном случае набор данных не может быть расширен.

Ответ 2

добавить ответ Midas.Inc. он доступен для добавления в набор данных. Вам следует обновить версию h5py, иначе может возникнуть ошибка

IOError: Unable to create file (file exists)

а также

with h5py.File('.\PreprocessedData.h5', 'a') as hf:

как я знаю, ". \" используется в Windows, в Ubuntu ожидается "./".

Я слишком нов, чтобы комментировать для меньшей репутации