ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

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でパスなどを保持しデータの準備を行う
  • __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