もうちょっと頑張って、佐藤健と亀梨和也を人よりも賢く見分けたい

[こちら](https://qiita.com/mine820/items/e7334eb843a82ad711e6)でAIに見分けさせようとしたがうまく行きませんでした。
このままでは悔しいので、もうちょっと頑張ってみることにします。

# データセットの工夫
まずはデータセットの画像を顔のみにトリミングし、かつ、サイズを正方形にした。
顔の向きはまちまち（正面だったり横を向いていたり）のままにしています。
サイズも大きいのから小さいのまでまちまちのままです。

○佐藤健フォルダ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/06b9a970-7b2b-eb51-5391-97df44bcf9e8.png)
○亀梨和也フォルダ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3d6bdd78-7418-b63b-030b-eedae45af539.png)

## 学習結果

ネットワークモデル等の設定はそのままで、学習してみました。
（GPUで1000epochぶん回しています）

```
loss: 0.0277 - acc: 1.0000 - val_loss: 0.7732 - val_acc: 0.7222
```

全然効果がなく、とっても残念な感じです。
それでも懲りずに、別のデータで識別してみます。
（こちらは、トリミングや正方形化はしていません）

```
seikai:  70.0 %
```

あれ？思ったよりも良い結果になってますね（苦笑）
（佐藤健：2/10枚ハズレ、亀梨和也：4/10枚ハズレ）
亀梨くんを少しだけ見分けられるようになった感じです。
でも、イマイチはイマイチです。

他にも画像データ数を増やすとか打つ手はありますが、とりあえず今回はデータセットの工夫はここまでとします。

気を取り直して別の工夫に行きましょう。

# ネットワークモデルの工夫

データセットは上記の工夫をしたまま、ネットワークモデルを工夫してみます。
まずはOver Fittingが疑われますので、そこから手を打っていきます。

最終層のGAPのあとに全結合を追加し、Dropoutを0.5で設定してみます。

```python
# 最終層の設定
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
predictions = Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid", kernel_regularizer=l2(.0005))(x)
model = Model(inputs=base_model.input, outputs=predictions)
```

## 学習結果

で、学習してみると．．．

```
loss: 0.0048 - acc: 1.0000 - val_loss: 2.1575 - val_acc: 0.5556
```

val_lossが悲しいことになっています（爆）
当然のことながら、識別してみても、

```
seikai:  65.0 %
```

と効果はなかったようです。
「なんでも佐藤健」状態に近づいてしまいました。
（佐藤健：0/10枚ハズレ、亀梨和也：7/10枚ハズレ）

# weightを変更してみる

imagenetの事前学習モデルを使用しているのですが、その重みパラメータを変更せずに使用していました。
最終層の重みパラメータの調整だけではどうにもならないようなので、せっかくの初期値を調整していきます。

```python
# base_modelはweightsを更新しない
#for layer in base_model.layers:
#    layer.trainable = False
```

なお、それまで1epoch=2秒だったのが6秒と遅くなりますが、まぁしょうがないですね。
なのでのんびり待っていられないので、EarlyStoppingを追加しました。

```python
from keras.callbacks import EarlyStopping

# 途中省略

# 学習を実行（10%はテストに使用）
early_stopping = EarlyStopping(monitor='val_loss')
model.fit(image_list, label_list, epochs=1000, batch_size=64, verbose=1, validation_split=0.1, callbacks=[early_stopping])
```

## 学習結果

その結果！！！

```
Epoch 22/1000
162/162 [==============================] - 6s 39ms/step - loss: 0.0017 - acc: 1.0000 - val_loss: 0.2523 - val_acc: 0.9444
<keras.callbacks.History at 0x7f5fe476ff60>
```

22epoch目で止まってしまいましたが、まぁまぁです。

```
seikai:  95.0 %
```

それでも95%までいきました。
（佐藤健：0/10枚ハズレ、亀梨和也：1/10枚ハズレ）

# 人（私）よりも賢いか？

一番やりたかった[某ドラマ](http://www.tbs.co.jp/gibomusu_blues/)の画像で確認します。
予告動画から15枚切り出しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/44672ade-abc6-091f-6ac1-e28cb6df573e.png)

その結果！？
（全て「0」が期待値）

```
file: drive/keras/data/gibo/image01.jpg result: 0.006102049
file: drive/keras/data/gibo/image02.jpg result: 0.96996385
file: drive/keras/data/gibo/image03.jpg result: 0.11807108
file: drive/keras/data/gibo/image04.jpg result: 0.94474953
file: drive/keras/data/gibo/image05.jpg result: 0.78054476
file: drive/keras/data/gibo/image06.jpg result: 0.0018015407
file: drive/keras/data/gibo/image07.jpg result: 0.99702007
file: drive/keras/data/gibo/image08.jpg result: 0.96259487
file: drive/keras/data/gibo/image09.jpg result: 0.86161226
file: drive/keras/data/gibo/image10.jpg result: 0.9739649
file: drive/keras/data/gibo/image11.jpg result: 0.02239359
file: drive/keras/data/gibo/image12.jpg result: 0.037958916
file: drive/keras/data/gibo/image13.jpg result: 0.62988317
file: drive/keras/data/gibo/image14.jpg result: 0.83684933
file: drive/keras/data/gibo/image15.jpg result: 0.49231532
```

9/15枚ハズレ．．．
ほらやっぱり、このドラマの佐藤健は亀梨和也に似ているんだよ！（笑）

※って結論でいいのか？！