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でも機能するはずです。
手伝ってくれてありがとうございます!
私はうまくいくと思われる解決策を見つけました!
これを見てください: 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