Python
DeepLearning
Keras
FineTuning
転移学習

乃木坂と欅坂メンバーをVGG16,VGG19,InceptionV3で転移学習してみた

転移学習を利用すると比較的簡単に精度よく一般物体認識ができるということで、筆者だと難しい乃木坂や欅坂メンバーのデータで認識できるのかどうか、やってみた。

コードは、以下に掲載している。

https://github.com/MuAuan/DL-FineTuning

利用したモデルは、以下のKerasDocumentionにあるVGG16,VGG19そしてInceptionV3のPreTrainingなモデルを利用した。ちなみに同じようにResNet50も利用しようとしたが、入力が一致せず利用できなかった。
※ResNet50の入力は、width と height は197以上ということで、データサイズ(224,224)で実施

【参考】

Keras Documentation Applications
https://keras.io/ja/applications/

Fine-Tuningのコードは以下を参考にした。

【参考】

VGG16のFine-tuningによる17種類の花の分類 by id:aidiary はてなブログPro
http://aidiary.hatenablog.com/entry/20170131/1485864665

やったこと

①データは、「MNISTのACGANを利用して、カラー画像のGANをやってみる - Qiita」と同じデータ

【参考】

https://qiita.com/MuAuan/items/0223aa3538029d498d14
②モデルは上記のとおり、ほぼ同じプログラムで実行できる。
 問題は、どの層までFineTuningするかということだが、10層、15層(つまりFineTuningなのか?)とVGG16については最後の全結合層(FineTuning)の三種類を実施。なお、10層に対しては、、「MNISTのACGANを利用して、カラー画像のGANをやってみる - Qiita」と同じくデータサイズ(128,128)で実施。15層とFineTuningはもともとのVGG16のデータサイズ(224,224)とした。
ResNet50で、Fine-Tuningの層を変えて、epoch当たりの時間を計測。やはり、Fine-Tuningの効果はありそう。精度とのトレードオフ。
しかし、収束性はResNet50が安定してるように見える。

③検証のために、TrainingされたVGG16モデルを使って、実際に認識してみた。

全層Training時とVGG16についてのFineTuningのACCの推移は以下のとおりとなった。

【結果】

各カテゴリーの画像がどの程度予測と一致しているかは以下の通りとなった
 その結果、どうもカテゴリ9が全く訓練されていないことが判明
 また、フィッティング率もカテゴリ毎にばらつきが大きい
 ⇒これらについては是非とも改善したい
  因みにこの場合のフィッティング率は69.2%であり、ほぼ今回のフィッティング率と同程度である    
  score.png

上記の結果はやはり、カテゴリ9を訓練していませんでした。
ということで、正常に訓練された(Data_Augmentationしましたが)は以下の通りでした。
score_aug.png

この結果から

1.データ数が多いカテゴリが精度よく、少ないカテゴリは悪い
2.ミスはカテゴリ0を除けば、乃木坂メンバー内、欅坂メンバー内でのミスが多い
  ⇒ほんとに検索の結果がカテゴリどおりか検証する必要がある
3.データ数の少ないカテゴリでは、データ数の多いカテゴリへのミスが多い
4.この段階で、フィッティング率は、75.6%でほぼ今回以下のAugmentationのフィッティング率と同程度

上記1-4の検証として以下実施

1.データ数をそろえてフィッティング実施 データ数(train440,test40)/カテゴリ
score_eqdata.png
2.データコンタミの検証として比較的カテゴリが分りやすい物体認識(水着、人、飛行機、船、馬、犬、猫、ロボット、男優)で、フィッティング実施 データ数(train440,test40)/カテゴリ
score_buttai.png

そして、上記のエラーはほとんどコンタミで発生していました。
上記で、フィッティング率89.25%

つまり、データをうまく作ると、この程度のデータ数(オリジナルデータ数60/カテゴリ)でもかなりの精度でフィッティングできそうです。

【ACCの推移】

VGG16「データ(128,128)再利用10層」
val_acc.png
VGG16「データ(224,224)再利用15層」
val_acc.png
VGG16「データ(224,224)再利用全結合層前まで20層」
val_acc.png

VGG19「データ(128,128)再利用10層」
val_acc.png
VGG19「データ(224,224)再利用全結合層前まで21層」
val_acc.png

InceptionV3「データ(128,128)再利用10層」
val_acc.png
InceptionV3「データ(224,224)再利用全結合層前まで310層」
val_acc.png

ResNet50「データ(224,224)再利用90層」52sec/epoch
val_acc.png
ResNet50「データ(224,224)再利用152層」37sec/epoch
val_acc.png
ResNet50「データ(224,224)再利用全結合層前まで172層」32sec/epoch
val_acc.png

ResNet50「データ(224,224)再利用90層」Augmentation
val_acc.png