web-dev-qa-db-ja.com

h5pyを使用してhdf5ファイルの特定のデータセットにデータを追加する方法

python(h5py)を使用して、h5-ファイル内の既存のデータセットにデータを追加する可能性を探しています。

私のプロジェクトの簡単な紹介:医用画像データを使用してCNNをトレーニングしようとしています。データをnparraysに変換する際の膨大なデータと大量のメモリ使用量のため、「変換」をいくつかのデータチャンクに分割する必要がありました->最初の100個の医療画像をロードして前処理し、nparraysをhdf5に保存しますファイル->次の100個のデータセットをロードし、既存のh5-ファイルを追加します。

次のように、最初の100個の変換されたnparrayを保存しようとしました。

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

ご覧のとおり、変換されたnparrayは4つの異なる「グループ」に分割され、4つのhdf5データセット[X_train、X_test、Y_train、Y_test]に保存されます。 LoadIPV()関数は、医用画像データの前処理を実行します。

私の問題は、次の100のnparrayを同じh5ファイルに既存のデータセットに保存することです。つまり、たとえば既存のX_train-dataset [100,512,512,9]を次の100のnparrayに追加したいということです。 X_trainが[200,512,512,9]になるように。同じことが、他の3つのデータセットX_test、Y_train、Y_testでも機能するはずです。

手伝ってくれてありがとうございます!

24
Midas.Inc

私はうまくいくと思われる解決策を見つけました!

これを見てください: h5pyでhdf5に増分書き込み

特定のデータセットにデータを追加するには、最初に対応する軸の特定のデータセットのサイズを変更してから、「古い」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
27
Midas.Inc