ディープラーニング学習でのデータ読み込み高速化
Google Colabを使ってディープラーニングの学習を行おうとしたが、データの読み込みが非常に遅い。 もともと使っていたコードでは画像ファイルを1枚1枚直接読み込んでいた。ローカルでは数分かかる程度であったが、Google Colabだと1時間近くかかるようになったので、流石に待てないので高速化する。
方法としては、画像ファイルをすべてHDF5ファイル1つに集約する。HDF5ファイルについては以下のリンクが参考になる。
概要
HDF5ファイルではグループによって、データを階層構造で保持することができる。今回は
/trainグループを作成して、そこにDatasetとして画像ファイルを保存していく。Datasetの名前はそのファイル名とする。
画像ファイルは
/dataディレクトリに保存してある。これをグレースケールで読み込み、保存していく。
/data /data/img_001.png /data/img_002.png ...
以降の作業はJupyer notebookなどPython環境で行っていく。
手順
'file.hdf5'というファイル名で作成する。このとき、ファイルがすでにあるとエラーになるので注意。
import numpy as np import h5py import glob, cv2 f = h5py.File('file.hdf5', mode='w')
グループを作成する。
group = f.create_group('/train')
画像ファイルをリストアップ。
file_list = glob.glob("/data/*.png")
グレースケールで読み込み、Datasetに保存する。
import os for file in file_list: arr = cv2.imread(file, cv2.IMREAD_GRAYSCALE) dataset = group.create_dataset( name=os.path.basename(file), shape=arr.shape, dtype=np.uint8) dataset[...] = arr
ファイルを閉じる。
f.close()
以上でデータをHDF5ファイルに変換することができた。
データ読み込みとチェック
HDF5ファイルのデータにアクセスし、データのチェックを行う。HDF5ファイルのデータには、辞書データのようにアクセスすれば良い。
f = h5py.File('file.hdf5', mode='r') dataset = f['/train'] c = 0 for file in file_list: arr_h5 = dataset[os.path.basename(file)][...] arr_org = cv2.imread(file, cv2.IMREAD_GRAYSCALE) if (arr_h5 != arr_org).all(): c = c+1 print("Diff :", c)
"Diff: 0"と表示されればOK。0以外ならなにかおかしいので見直し。