Mobilenetv2でFineTuningいろいろ

# はじめに
思い立ったのでおうちで自前画像の画像分類してみました．
ついでに気になったのでMobilenetv2でFine tuningの精度をいろいろ比べてみたのを記事にします．

※おうちPC環境
　iMac (Retina 4K, 21.5-inch, 2017)
　3.6 GHz クアッドコアIntel Core i7
　16 GB 2400 MHz DDR4

# 忙しい人のためのなんちゃら
　・Mobilenetv2でFineTuningいろいろしてみたよ
　・犬/猫/鳥の３分類のタスクだよ
　・Flickrで画像収集したよ
　・FineTuningなし/16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1層目以降を再学習/全て再学習で精度を比べてみたよ
　・今回は14層目以降学習と11層目以降学習が同じ正解率(94.4%)で精度が良かったよ

# タスクの設定と画像収集
2値分類だとなんとなくなんでもできちゃいそうだから3値分類，でもわかりやすく結果が出るのがいいから動物の分類やってみたいなと思い，よくやられている「犬」「猫」の分類に「鳥」を付け加えた3値分類やってみることにしました．

そうと決まれば画像の収集です．
ウェブから集めたくてなんかいろいろみてみていたら[flickr](https://www.flickr.com/groups/japanese/)で集めるのが良さそうだったのでflickrで集めることにしました．
参考にしたのはこちらの記事です．
[pythonでflickrから画像データをスクレイピングする方法](https://qiita.com/zundokokiyoshi999/items/2c341c5c8b6be6df06f6)

115*115サイズの画像を最大500枚まで一度にダウンロードできます．（欲張って1000枚ダウンロードしようとしたら500枚しかできなかった）
「dog」「cat」「bird」を引数にそれぞれ500枚ずつ集めました．
その中から被写体が小さすぎる画像やら人間や他の動物が入っちゃってる画像やらを取り除いて450枚ずつを採用することにしました．
その中から30枚ずつをtest,validationに振り分け，残りの390枚をtrainに使いました．
画像はこんな感じ．PCがかわいい犬まみれです．
![スクリーンショット 2020-10-11 11.22.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/05d324e1-f05c-feb8-a389-22d6fcfbf609.png)

以下のような構成のフォルダにそれぞれ画像を振り分けます．
```

├── data
│   ├── test
│   │   ├── bird
│   │   ├── cat
│   │   └── dog
│   ├── train
│   │   ├── bird
│   │   ├── cat
│   │   └── dog
│   └── val
│       ├── bird
│       ├── cat
│       └── dog
```

# 学習とFineTuning
コードはこちら
[https://github.com/fu-a-sak/mobilenetv2_keras](https://github.com/fu-a-sak/mobilenetv2_keras)

FineTuningの層の設定は，いつも参考にさせていただいているこちらのページを参考にしました．
[TensorFlow, Kerasで転移学習・ファインチューニング（画像分類の例）](https://note.nkmk.me/python-tensorflow-keras-transfer-learning-fine-tuning/)

fineTuningしていない学習は学習率0.001始まり,50epoch学習させました．
fineTuningした学習は一律学習率0.0001始まり,30epoch学習させました．
バッチサイズは一律8に,画像は96*96にリサイズしています（学習済み重みが96*96のものがあるため）
今回Optimizerは論文にならってRMSpropを使っています．（はじめSGDを使っていたけどそれよりRMSpropの方が精度出ました．今回は詳しくやってませんがこの辺比べてみるのも面白いのかも）

以下結果です．
学習曲線とテスト画像での結果のコンフュージョンマトリックスを示します．学習曲線はお恥ずかしながら軸がなんなのか書き忘れてしまったんですけど，縦軸がそれぞれ(正解率とloss)の値，横軸がepoch数です．

### FineTuningなし
Mobilenetv2のweightをNoneで学習させたものです.
いい感じで学習できてますがtrainもvalも正解率が60％前後をうろうろしてます．もうちょっと精度出て欲しいですね
test画像での正解率は68.9%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/b754d61a-74d5-73a8-02b5-d2486f29c46f.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/8ea1ac56-ee4b-a756-7b48-6f19cc80eb96.png width=40%>

### 16層目以降を再学習
Mobilenetv2のweightをimagenetにし,16層目以降を再学習させたものです
valの正解率がやたら高いですね．
test画像での正解率は93.3%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/7dab5112-e947-e2f9-6a60-2efc726b1226.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/d879fb7e-5578-cdf0-9f6b-6206e3a7242b.png width=40%>

### 15層目以降を再学習
Mobilenetv2のweightをimagenetにし,15層目以降を再学習させたものです
これまたvalの正解率がやたら高いですね．
test画像での正解率は90.0%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/ecd48879-2ef0-95a7-5a6b-8392c3bf591f.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/42a46b53-8509-0c54-321b-39ae9ed4f8fa.png width=40%>

### 14層目以降を再学習
Mobilenetv2のweightをimagenetにし,14層目以降を再学習させたものです
test画像での正解率は94.4%．いい感じです．
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/b6718513-d9b3-a24c-40e6-789f14e928e8.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/f81a7585-345b-35a5-ce11-eb365ec47eac.png width=40%>

### 13層目以降を再学習
Mobilenetv2のweightをimagenetにし,13層目以降を再学習させたものです
test画像での正解率は86.7%です．ちょっと下がった？
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/d278e72b-323f-3515-6b60-11b803f92b36.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/6295544c-1ea4-748a-a3c4-e86e1de2fb1d.png width=40%>


### 12層目以降を再学習
Mobilenetv2のweightをimagenetにし,12層目以降を再学習させたものです
test画像での正解率は86.6%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/8721a907-327a-854f-0098-286a1c2f4911.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/7e4748d0-e65e-76a7-7e94-10e9c600f693.png width=40%>

### 11層目以降を再学習
Mobilenetv2のweightをimagenetにし,11層目以降を再学習させたものです
test画像での正解率は94.4%です．ここに来てまた上がった
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/979deb48-42a1-1072-e05e-efeb2a223cdd.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/8d9afc27-3b41-91e1-adf8-3ff0ad69b3ac.png width=40%>

### 10層目以降を再学習
Mobilenetv2のweightをimagenetにし,10層目以降を再学習させたものです
test画像での正解率は88.9%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/43cad700-3279-859b-38e0-731be07aec38.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/bed8a4e2-ca39-3c31-7af2-0d46f4614cf9.png width=40%>

### 9層目以降を再学習
Mobilenetv2のweightをimagenetにし,9層目以降を再学習させたものです
test画像での正解率は92.2%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/dab3c9c4-a727-5a60-c425-9837fe978c03.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/5f0d543b-47b8-0a4c-0404-254d1e9a191f.png width=40%>

### 8層目以降を再学習
Mobilenetv2のweightをimagenetにし,8層目以降を再学習させたものです
test画像での正解率92.2%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/b4cda3a3-3117-dee5-7023-11c92634e339.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/015ce7d4-894c-0ff9-02ea-ae9aeb70bf76.png width=40%>

### 7層目以降を再学習
Mobilenetv2のweightをimagenetにし,7層目以降を再学習させたものです
test画像での正解率は85.6%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/34839f4b-15ad-1885-820c-9d267831c235.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/d811a536-fa22-b780-4c87-3a0051946e8f.png width=40%>

### 6層目以降を再学習
Mobilenetv2のweightをimagenetにし,6層目以降を再学習させたものです
test画像での正解率は87.8%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/b90841d1-9351-8057-ccba-b556b0c4ff4f.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/d45240aa-096d-0dc9-71ff-e642c6ef692b.png width=40%>

### 5層目以降を再学習
Mobilenetv2のweightをimagenetにし,5層目以降を再学習させたものです
test画像での正解率は90.0%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/6b60ecc2-be76-0bf1-9e7e-c2eab1b998bd.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/4b2fd171-4d46-122b-28af-bf36d0e618b4.png width=40%>

### 4層目以降を再学習
Mobilenetv2のweightをimagenetにし,4層目以降を再学習させたものです
test画像での正解率は86.7%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/b8a6bad0-d088-6cd0-9529-ee2714494d9c.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/3e56bdb9-269b-a8fe-5d98-3807582625fd.png width=40%>

### 3層目以降を再学習
Mobilenetv2のweightをimagenetにし,3層目以降を再学習させたものです
test画像での正解率は88.9%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/8ad82ca6-f1d4-51aa-4ed5-ad23b5a933ea.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/ec3d06e8-aba9-88af-cad3-55f507a087b4.png width=40%>

### 2層目以降を再学習
Mobilenetv2のweightをimagenetにし,2層目以降を再学習させたものです
test画像での正解率は83.3%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/7a000136-fbf1-eabf-7068-699484cb1c55.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/ebe2318b-e2e4-f1f7-c854-744558c31742.png width=40%>

### 1層目以降を再学習
Mobilenetv2のweightをimagenetにし,1層目以降を再学習させたものです
test画像での正解率は90.0%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/039ff517-fdbc-c92a-9da4-f7b0d113cd5e.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/56110fc5-eba6-eb3d-8917-b3343869d5bf.png width=40%>

### 全てを再学習
Mobilenetv2のweightをimagenetにし,どの層もFreezeさせずに学習してみた結果です．
test画像での正解率は91.1%です
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/61e51456-6435-47ff-29b9-77247957527c.png width=40%> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/e8aca5f4-1ad4-23cc-a989-da3f92fd1f3e.png width=40%>

# まとめ
今回の正解率だけでみると14層目以降再学習と11層目以降再学習が同点(94.4%)で良い，という結果になりました．
なんとなく終わりの層の方だけを再学習させて精度出るのがFineTuningで，前の層の方まで再学習させていくと精度悪くなっていくのかなあと思ってましたがそこまで悪くなんなかったなってのが印象です．
そもそもimagenetの重み使って学習するだけでだいぶ精度が向上するので，そんなに違いがでないってところなのかなあと思ったりしています．

# 終わりに
~~正直全部結果載せるのめちゃめんどくさかった...~~
しかしながらなんとなく，これからは14層目以降再学習のFineTuningをまず試してみようかなという指標はできました．
そういう意味ではやって良かった気がします
休みの日に余力があったらこれをスマホアプリとして実装してみたいなあなんて思っているので，これからもぼちぼちやろうと思います．