【苦しみながら理解する深層学習】VGG16 実装編

実装

kerasにはvgg16の学習済みモデルが標準設定らしい。

kerasから使ってみる

まずはこちらを参考に動かしてみるところからいこう。

とにかく、これを実行したんですがまぁまぁ時間がかかった…
10分〜20分程度。(回線の問題で別のwifiでやったら1分ぐらいだったw)
でも一度インストールすると2回目から早くなった。
またpillowが必要なのでconda installしておく。

そしてまぁ同じことをしておくw
なんとなく意味はわかるけど、もう一回layerの意味を見直して置いたほうがよさそう。

top-5を出してみる

試す画像はコレ。

テスト画像

python test_vgg16.py [画像のpath]を実行すると

しっかり、Angoraって認識されました。(記事の通り)
まずAngoraって動物を知りませんが…

転移学習( fine tuning )

こちらの記事を基に実装していきます。

転移学習とは
例えば、CNN(Convolutional Neural Network)で画像認識などを一からモデル構築するとなると、大量のサンプル画像を集めなければいけないですし、さらに学習にも多くの時間がかかります。
転移学習では、すでに学習済みのモデルを使って、より少ない画像、より短時間で学習モデルを構築することを目指します。

画像元

15層以降を再学習する。

今回の実装では、VGG16の全結合層を外して新たに全結合層を追加し、15層以降のみを学習させます。(14層までの重みは更新しない)
これによって、VGG16の高い特徴量抽出を継承しつつ、少サンプル・短時間で精度の高い学習モデルを構築できます。

なぜこんなことをするかというと、CNNにおいて浅い層では縦線・横線などのおおよその特徴を抽出し、深い層(VGG16の15層以降など)では、その画像特有の特徴を抽出することがわかっています。
つまり、深い層を取り外し、浅い層を再利用することで効率よく転移学習することができます。

なるほど…わかりやすい…

今回のtraningに使われた画像がこのレポジトリに入っているんですが、思った以上に少ない。
恥ずかしながらまぎまどはみたことないんです。

画像がtrain 250枚、validation 150枚、test 412枚入ってます。displayは冒頭のような画像を表示させるときに使う用です。中身はtestと同じ。

ちなみにこのデータセットは、Googleの画像検索で延々とポチポチして自作しました。いやぁ今回やってて一番楽しかったポイントですね(遠い目
これは絶対にスクレイピングした方が…

ネットワークの構築

ほとんどみた感じなのですが、

ここがちょっとわかりにくそう。
kerasあんまり使ったことないし、なんか違和感が…w

include_topはVGG16のトップにある1000クラス分類するフル結合層(FC)を含むか含まないかを指定する。今回は画像分類を行いたいためFCを含んだ状態で使う。FCを捨ててVGG16を特徴抽出器として使うことでいろいろ面白いことができるがまた今度取り上げたい。

なので前結合をlayerを除外するためにinclude_top=Falseでbase_modelを作っています。
base_model.outputはこんな感じです。

GlobalAveragePooling2D()で1次元にして、Dense()で全結合層を追加するという流れですね。

GlobalAveragePooling2D()
Global average poolingです。特徴マップのサイズを1×1にし、flatten(1次元に)します。この後は全結合層のみが追加できます。

ここをみました。

が、、、ここで気になるのが、何故全結合で一度1024にしてから5にするかです。
vgg16の構成をみればそれはまぁ、そうなので同じようにしているということでしょうか。
そして、最終的な分類だけ5つにするという。

画像の前処理

kerasのデータ拡張について

なお、rescaleは正規化のための仕組みで、RGB(0〜255)で読み込まれた各画素のRGB値を0.0〜1.0の間に収まるように正規化している。

引用元

学習

前処理した画像を元に新しく作ったモデルで学習させてh5ファイルを作成する。

結果

まず、githubを見ればわかるが、はじめにモデルを作ったとき(画像の前処理を入れる前)にjsonファイルに保存されている。
ただ、ここではmodelのアーキテクチャを保存しているだけだから、タイミングはあまり意味をなさないかもしれない。
modelのアーキテクチャとは別に重みはh5ファイルに保存してあるから。

validation_accuracyは最終的に約80%になりました。
test accuracyも約80%。
訓練画像250枚(各キャラ50枚ずつ)、この短時間でこの精度までいくのはやはり転移学習のおかげだと思います。

今回のまどか☆マギカのキャラはImageNetにはない画像なので、VGG16にとっては見たことのない画像です。
それでもここまで精度を上げられたのはImageNetで学習してうまく特徴量を抽出できたおかげでしょう。

今更感はあるけど、これは確かに強力だ…

その他

転移学習とfine tuningの違い

一緒だと思っていたけど、違うらしい

ざっくりと説明すると、違いは以下になります。
– 転移学習:既存の学習済モデル(出力層以外の部分)を、重みデータは変更せずに特徴量抽出機として利用する。
– ファインチューニング:既存の学習済モデル(出力層以外の部分)を、重みデータを一部再学習して特徴量抽出機として利用する。

ということは今回の実装はファインチューニングと言えるのか。な

flow_from_directoryがめちゃくちゃ便利そう

flow_from_directoryでフォルダを分けているだけでラベルを張ってくれているように思うんですが。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です