【機械学習】MNIST, CIFAR-10 でモデルの精度が上がって満足している君へ

## はじめに
**「君」というのは自分のことです。**
AI・機械学習・ディープラーニングについて勉強する方が読んでくださっていることと思います。
勉強しているとつい、モデルの精度や構築方法ばかりに目が向いてしまいますよね。

しかし、大事なことは組み込みたいプロジェクトの**どの部分を AI で代替するか**を考えることだと思います。
（私もつい本質を見失いがちになります。）
勉強しながらも常にマクロな視点で物事を考えていこう！というコンセプトで書いています。
勉強には [KIKAGAKU](https://www.kikagaku.ai/)をおすすめします。

## 精度が上がりました！のその先を考えましょう

機械学習・ディープラーニングについて勉強していくと必ず出てくるであろう

- **MINIST**
- **CIFAR-10**


といったデータセット。
ディープラーニングの火付け役となった**畳み込みニューラルネットワーク（CNN）**の実装の際、まずは上記のデータセットを使う方がほとんどでしょう。

MNIST に対して CNN を使って学習させました。

```
{'loss': 0.10484535992145538,
 'test_acc': 0.9750000238418579,
 'test_loss': 0.084235779941082,
 'val_acc': 0.9708040356636047,
 'val_loss': 0.09426042437553406}
```
検証用データ、テスト用データに対して約 97% の正解率で分類できるモデルの構築ができました。

CIFAR-10 に対して学習済みモデルを使ってファインチューニングを行いました。

```
{'loss': 0.5768303871154785,
 'test_acc': 0.791796863079071,
 'test_loss': 0.61225825548172,
 'val_acc': 0.785449206829071,
 'val_loss': 0.6361880898475647}
```
たった数回の学習で正解率を約 79% まで上げることができました。
さらにチューニングを施せばもっと正解率を上げられるでしょう。
それは当然、大規模画像認識コンペティション（ILSVRC）でエラー率を下げるために、世界中の研究者が考え出した最高のモデルなのですから。

### さあ、モデルとしてシステムに組み込めるでしょうか？
MNIST の場合の正解率は 97% 。
つまり **3/100 は予測を外す可能性がある**わけです。
（私の場合、仮に 100% 出ても学習段階でラベル付けをミスしていないか？などと不安になりますが）

ディープラーニングを知らない上司に說明するとしましょう。
「3% も外すのか？大金はたいて導入するまでもない！」と一掃されて終わりでしょう。

仮に導入できたとしましょう。
1 日中稼働させるシステムの場合、いつ出てくるかわからない 3% の誤検知に対して常に人が監視する必要があるわけです。

逆に大変じゃないですか？
異常品を見逃してはいけない最後のチェック係を自分が担当しているとしましょう。
たった 3% を見逃してはいけないのは逆にストレスになりませんか？

私なら嫌ですね。笑

しかし、視点を変えてみるとこれまで人が行っていた作業を 97% 代替（自動化）できると考えることもできます。
人によるチェックは欠かせないと思いますが、これでも運用できるなら組み込んでもいいでしょう。
AI 以外の手段も含めた自動化の検討が必要です。


**もうひとつ見逃してはいけないポイントがあります。**
MNIST の画像サイズ

```
(28, 28)
```
今までこのサイズの画像に出会ったことはありますか？
私は生まれてからこれまでこんなに小さい画像は MNIST 以外で見たことは有りません。

ましてやこんなに簡単な手書き数字の分類くらいしてもらわないとディープラーニングって何？となりますよね。
実際扱うデータサイズはもっと大きく、数字だけの画像ではないはずです。


### そもそもデータの準備が一番大変だよ？
もう少し難しいデータセットで取り組んでみましょう。
[MVTec Anomaly Detection Dataset (MVTec AD)](https://www.mvtec.com/company/research/datasets/mvtec-ad/)
異常検知用のデータセットです。

- **学習用データは傷や欠陥の無い正常品のみ**

当然です。今は逆に異常品を入手するのが困難な時代です。
正常データのみで学習させる手法（Auto Encoder など）を使って異常検知してみましょう。

前処理としてネジの位置、向きを揃え、画像処理をかけて、サンプル条件を揃えて、、、
やっとディープラーニングにかけて、差分を比較して、、、
![3_092.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605917/274070da-c6c9-7fb0-3fad-5523e5e894a1.png)

上手く傷部分だけ検出できました！


あれ？ディープラーニングってデータがあれば何でもできるんじゃないの？
学習よりも前処理のほうが時間かかったんだけど。。。

さらにもうひとつ。
今回のデータの 1 サンプルです。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605917/7c6939e6-00f4-9bbb-05fe-2d1297fe578e.png)

綺麗に傷が写っていますね。

- **撮影するときに傷が下を向いていたら？**
- **傷はあるはずなのに画像には映らなかったら？**
- **そもそも画像からネジがはみ出したら？**
- **照明の影響で変なテカリなどが写ったら？**
- **そもそも撮影環境はうちにある？**
- ....

繰り返しになりますが、異常データなんてめったに手に入りません。
考えれば考えるほどそもそも学習用のデータ準備のほうが大変なのは明確でしょう。


つまり現実世界は教師なし学習をするか、正常データのみで学習させる方法しかないのです。
初歩段階の教師あり学習で満足していてはいけません。


### 最後に
話を戻しましょう。
最初に話していた MNIST や CIFAR-10 で良い精度が出せました！

**だから何？**
改めて言います。
タイトルの「君」は自分のことです。

MNIST や CIFAR-10 で実装して良い結果が出ました。
そこで満足していていいのでしょうか？ほんとに CNN を今後使えるのでしょうか？
現実はもっと難しいです。
まずデータ準備、データが準備できたとしてディープラーニングで人間を代替できるような結果をだせるのか？
考えなければいけないことは山程あります。
GitHub を見ても様々なモデルで MNIST や CIFAR のデータセットで実装がされています。
モデルの挙動を確認できた程度だと考えておくのが良いでしょう。
**満足するな。その先を考えろ。**

ただし、データや条件さえ揃えばディープラーニングは人間には想像もつかない結果をもたらしてくれることもあります。
可能性を秘めていることは間違いありません。
人間よりもはるかに賢いでしょう。

この分野を学べば学ぶほどそもそもモデル構築をすることに意味はあるのか？と考えてしまいます。
モデル構築は研究者やプロに任せておいて、
そもそものデータサイエンス、モデルの予測結果に対しての意味づけ、組み込みを考えるほうが遥かに重要になるでしょう。

しっかりと工程分解し、どの部分を AI で代替するか、AI 以外の手段も常に意識しながら上手く付き合っていきたいものですね。
**AI は人間の新たな選択肢のひとつ**（先輩の名言）


やっぱり人間の目ってすごいんだなぁ。