Как добавить данные в один конкретный набор данных в файле 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 ожидается "./".
Я слишком нов, чтобы комментировать для меньшей репутации