DeZeroのデータセットで画像データをまとめる(Dataset, DataLoader)
今回は、ディープラーニングのフレームワークDeZeroで画像データをまとめるためのDatasetとDataLoaderの使用方法のまとめ(備忘録)です。
DeZeroとは
斎藤康毅さんによる「ゼロから作るDeepLearning③ フレームワーク編」でゼロから作れるフレームワークです。斎藤さんが作成したものはPyPIに登録してありpipでインストールし使用することができます。Define-by-Runの方式が取られており計算グラフが自動で作成され、自動微分によって複雑なコードを書くことなく学習を行うことができます。
Datasetクラスの役割
Datasetは、ディープラーニングで使用するデータをまとめて保持しておくためのクラスで、DataLoaderに渡すとバッチ毎のデータが引き抜かれ処理されていきます。DeZeroでデータを使用する際はこのDatasetでデータを扱います。
Datasetを作成する際ののルール
DeZeroのDatasetクラスを継承しデータを作成する場合は下記を実装する必要があります。
※Datasetの__getitem__がDataLoaderクラスのインスタンス生成時__next__内で呼び出されバッチ分のnumpy配列を作ります。
- __init__で学習orテストのフラグ、前処理を行うor行わないのフラグを設定
- また親クラスの__init__を呼び出しを実装
- prepareでパスなどを保持しデータの準備を行う
- インスタンス変数のdataとlabelにそれぞれのデータを格納する
- __getitem__でインデックスでデータを取り出した時の処理方法
- transformにセットした前処理のみを行う場合はオーバーライドの必要なし
- __len__でデータのサイズを測る
DataLoaderクラスの役割
学習時、for文にDataLoaderのインスタンスを渡すと、実装している__itter__関数と__next__関数が反応しDatasetからバッチ分のx(データ)とy(ラベル)をNumpy配列にして返してくれます。またshuffleをTrueにするとデータのシャッフルを行います。
【引数】:データセット、バッチサイズ、shuffle要否の判定
GPUでの処理
GPUで処理する際はこのDataLoaderのインスタンスと後に作成するmodelのインスタンスをto_gpu()でGPUに渡す必要があります。
※DataLoaderクラス、Modelクラスともにto_gpu()関数とto_cpu()関数を実装しています(Modelクラスは親クラスのLayerクラスが実装しておりそこから継承)
実際の実装コード例は下記記事を参照
ディープラーニング: フレームワークDeZeroで画像認識をする方法① - ビジネスパーソン・ガジェット置場 empty lot for business