Просто чтобы прояснить, как создать набор данных в первую очередь, вот как это будет выглядеть: h5f.create_dataset ('X_train', data = orig_data, сжатие = "gzip", chunks = True, maxshape = (None, )) Ключевая часть, настраивающая maxshape, чтобы быть кортежем, как у меня есть.

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

Краткое введение в мой проект: я пытаюсь обучить CNN, используя данные медицинского изображения. Из-за огромного объема данных и интенсивного использования памяти при преобразовании данных в nparrays мне пришлось разделить «преобразование» на несколько фрагментов данных -> загрузить и предварительно обработать первые 100 медицинских изображений и сохранить nparrays в hdf5 file -> Загрузить следующие 100 наборов данных и добавить существующий h5-файл.

Теперь я попытался сохранить первые 100 преобразованных nparrays следующим образом:

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

Как можно видеть, преобразованные nparrays разбиты на четыре разных «группы», которые хранятся в четырех наборах данных hdf5 [X_train, X_test, Y_train, Y_test]. Функция LoadIPV () выполняет предварительную обработку данных медицинского изображения.

Моя проблема в том, что я хотел бы сохранить следующие 100 nparrays в том же файле h5 в существующие наборы данных: это означает, что я хотел бы добавить, например, существующий набор данных X_train [100,512,512,9] со следующими 100 nparrays таким, что 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
 Egor Kraev22 февр. 2018 г., 19:17
Чтобы это работало, вам также нужно убедиться, что вы задали аргумент maxshape при создании набора данных, иначе h5py не позволит вам его расширить.
 Russell04 янв. 2019 г., 20:32
Просто чтобы прояснить, как создать набор данных в первую очередь, вот как это будет выглядеть: h5f.create_dataset ('X_train', data = orig_data, сжатие = "gzip", chunks = True, maxshape = (None, )) Ключевая часть, настраивающая maxshape, чтобы быть кортежем, как у меня есть.

Ваш ответ на вопрос