ディープラーニング: DeZeroに実装されているVGG16の動きまとめ
こちらは自分でモデルを作成するために、DeZeroにも準備されているモデルVGG16とそれに伴う各クラスの動きをまとめておくページです。
VGG
2014年、ILSVRCというコンペティションで準優勝したモデル。
特徴
3x3の畳み込み層を2~4回転させプーリング層で半分にする。それを複数繰り返し全結合層でdropoutを使用して結果を出力します。
※3x3…フィルターサイズ
※基本的には畳み込みのチャンネル数はプーリングを行うと2倍になるとのこと(64 → 128 → 256 → 512)
※活性化関数はReLUが使われている
DeZeroで実装されているVGG16の構成
- Modelクラスを継承している
- ModelクラスはLayerクラスを継承継承している
- インスタンス作成時にpretrained=Trueを引数に渡すと学習済みの重みを使用可能
- インスタンスを生成し入力値を渡すと順伝播が実行され、各レイヤを通って予測値を出力する
- __init__()
- 各レイヤインスタンスの作成(畳み込み層13、全結合層3)
- pretrained=Trueなら学習済み重みデータを読み込み
- forward()
- 順伝播の処理を行う。入力値を受け各レイヤのインスタンスに渡し活性化関数に通す
- preprocess()
- 画像データに対して事前準備を行う
- RGBへのコンバート
- サイズを224*224にリサイズ
- 値を調整し、チャンネル*高さ*幅に並べ替えて戻す
- 画像データに対して事前準備を行う
DeZeroのモデルクラスの構成
- Layerクラスを継承している
- 計算グラフの可視化関数(plot)
DeZeroのレイヤークラスの構成
- 変数を変換するクラスだが、パラメータを保持し、パラメータを使った変換を行う役割を持ったクラス
- __init__()
- 空のパラメータの集合を生成
- __setattr__()
- __call__()
- インスタンス生成時にforward()を呼び出し順伝播の処理を実行する。
- forward()
- ここでは実装せず、継承先のクラスで実装する(例)VGG16クラスで実装
- params()
- レイヤインスタンスが持っているパラメータを取り出す
- cleargrads()
- レイヤが持つ全ての勾配をリセットする
- to_cpu()
- パラメータをcpuに送る
- to_gpu()
- パラメータをgpuに送る
- _flatten_params()
- save_weights()
- パラメータを保存する
- load_weights()
- パラメータを読み込む
VGG16モデルのインスタンスを作成し学習行うコードについては下記参照
ディープラーニング: フレームワークDeZeroで画像認識をする方法① - ビジネスパーソン・ガジェット置場 empty lot for business
VGG16に限らずモデルを使って学習を行う基本コードは下記参照
python: DeZeroでのディープラーニングの学習と可視化の流れ - ビジネスパーソン・ガジェット置場 empty lot for business