web-dev-qa-db-fra.com

Comment ajouter des données à un ensemble de données spécifique dans un fichier hdf5 avec h5py

Je cherche une possibilité d'ajouter des données à un ensemble de données existant dans un fichier h5 en utilisant python (h5py).

Une courte introduction à mon projet: j'essaie de former un CNN en utilisant des données d'images médicales. En raison de l'énorme quantité de données et de l'utilisation intensive de la mémoire lors de la transformation des données en nparrays, je devais scinder la "transformation" en quelques morceaux de données -> Charger et prétraiter les 100 premières images médicales et les enregistrer au format hdf5. file -> Charge les 100 prochains jeux de données et ajoute le fichier h5 existant.

Maintenant, j'ai essayé de stocker les 100 premiers nparrays transformés comme suit:

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

Comme on peut le voir, les nparrays transformés sont divisés en quatre "groupes" différents qui sont stockés dans les quatre jeux de données hdf5 [X_train, X_test, Y_train, Y_test]. La fonction LoadIPV () effectue le prétraitement des données d’image médicale.

Mon problème est que je voudrais stocker les 100 prochains nparrays dans le même fichier h5 dans les jeux de données existants: Cela signifie que je voudrais ajouter, par exemple, le X_train-dataset existant [100 512 512,9] aux 100 nparrays suivants. tel que X_train devient [200,512,512,9]. La même chose devrait fonctionner pour les trois autres jeux de données X_test, Y_train, Y_test.

Merci beaucoup pour votre aide!

24
Midas.Inc

J'ai trouvé une solution qui semble fonctionner!

Jetez un oeil à ceci: écrit incrémental en hdf5 avec h5py !

Afin d’ajouter des données à un ensemble de données spécifique, il est nécessaire de redimensionner l’ensemble de données spécifique dans l’axe correspondant, puis d’ajouter les nouvelles données à la fin du "vieux" nparray.

Ainsi, la solution ressemble à ceci:

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
27
Midas.Inc