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

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

#コードは、以下に掲載している。
https://github.com/MuAuan/DL-FineTuning

利用したモデルは、以下のKerasDocumentionにあるVGG16,VGG19そしてInceptionV3のPreTrainingなモデルを利用した。ちなみに同じようにResNet50も利用しようとしたが、入力が一致せず利用できなかった。
※ResNet50の入力は、width と height は197以上ということで、データサイズ（２２４，２２４）で実施
###【参考】
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するかということだが、１０層、１５層（つまりFineTuningなのか？）とVGG16については最後の全結合層（FineTuning）の三種類を実施。なお、１０層に対しては、、「MNISTのACGANを利用して、カラー画像のGANをやってみる - Qiita」と同じくデータサイズ（１２８，１２８）で実施。１５層とFineTuningはもともとのVGG16のデータサイズ（２２４，２２４）とした。
ResNet50で、Fine-Tuningの層を変えて、epoch当たりの時間を計測。やはり、Fine-Tuningの効果はありそう。精度とのトレードオフ。
しかし、収束性はResNet50が安定してるように見える。

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

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

#【結果】
各カテゴリーの画像がどの程度予測と一致しているかは以下の通りとなった
　その結果、どうもカテゴリ９が全く訓練されていないことが判明
　また、フィッティング率もカテゴリ毎にばらつきが大きい
　⇒これらについては是非とも改善したい
　　因みにこの場合のフィッティング率は６９．２％であり、ほぼ今回のフィッティング率と同程度である　　　　
　　![score.png](https://qiita-image-store.s3.amazonaws.com/0/233744/b726a2fb-cce0-6f40-b854-3ff9e246712a.png)

上記の結果はやはり、カテゴリ９を訓練していませんでした。
ということで、正常に訓練された（Data＿Augmentationしましたが）は以下の通りでした。
![score_aug.png](https://qiita-image-store.s3.amazonaws.com/0/233744/cebbbd68-4064-d17b-499c-7ac5b52e81ef.png)

#この結果から
１．データ数が多いカテゴリが精度よく、少ないカテゴリは悪い
２．ミスはカテゴリ０を除けば、乃木坂メンバー内、欅坂メンバー内でのミスが多い
　　⇒ほんとに検索の結果がカテゴリどおりか検証する必要がある
３．データ数の少ないカテゴリでは、データ数の多いカテゴリへのミスが多い
４．この段階で、フィッティング率は、７５．６％でほぼ今回以下のAugmentationのフィッティング率と同程度

#上記１－４の検証として以下実施
１．データ数をそろえてフィッティング実施　データ数（train４４０，test４０）/カテゴリ
![score_eqdata.png](https://qiita-image-store.s3.amazonaws.com/0/233744/513292a0-0fc3-46a4-783f-e3cb707ccec4.png)
２．データコンタミの検証として比較的カテゴリが分りやすい物体認識（水着、人、飛行機、船、馬、犬、猫、ロボット、男優）で、フィッティング実施　データ数（train４４０，test４０）/カテゴリ
![score_buttai.png](https://qiita-image-store.s3.amazonaws.com/0/233744/06ccbd4b-a6a0-b149-d0a9-af03f8ebc4b8.png)

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

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

#【ACCの推移】
VGG１６「データ（１２８，１２８）再利用１０層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/adc61146-6084-2818-1558-85e12d5e5197.png)
VGG16「データ（２２４，２２４）再利用１５層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/4d269532-3a7c-7d2a-0327-1c99c621d8ed.png)
VGG16「データ（２２４，２２４）再利用全結合層前まで２０層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/5ceb3676-58e2-d9b4-3a6f-a36808ac0b48.png)

VGG１９「データ（１２８，１２８）再利用１０層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/3e748e84-c0eb-f1c3-f457-f1be3c734998.png)
VGG１９「データ（２２４，２２４）再利用全結合層前まで２１層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/b8216bdf-4b7e-eb94-b7dd-cfb69c29567b.png)

InceptionV3「データ（１２８，１２８）再利用１０層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e00af6a2-919c-512e-2c6e-9d8c0b4c9765.png)
InceptionV3「データ（２２４，２２４）再利用全結合層前まで３１０層」
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/f75b5559-99fc-28be-7219-6669961aabd6.png)

ResNet50「データ（２２４，２２４）再利用９０層」５２sec/epoch
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e45077f3-a647-5660-8d2e-f2f736182f29.png)
ResNet50「データ（２２４，２２４）再利用１５２層」３７sec/epoch
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/a5045e15-5149-0857-c696-07a52fd52464.png)
ResNet50「データ（２２４，２２４）再利用全結合層前まで１７２層」３２sec/epoch
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/82246b84-2e11-961f-6507-878dc7b2c92e.png)

ResNet50「データ（２２４，２２４）再利用９０層」Augmentation
![val_acc.png](https://qiita-image-store.s3.amazonaws.com/0/233744/64f2d6f3-1fcd-5376-0886-222f2a241aee.png)