日大文系卒が学び実装する画像認識

## 初めに
ここ最近ずっとディープラーニングでの画像認識の学習をしておりました。
その成果物/学習過程で作成したipynbファイルをシェア致します。
勿論忘備録/データ格納が主ですが、なかなかどうして初心者にも分かりやすい内容になっているのではないかと思います。

- 気軽にダウンロードして実行できる。
- 実装して確認できるのでイメージを掴みやすい。理論は他を当たって頂ければ...
- 至る所に私のメモがあります。是非ご参考に。(ダークソウル並みにあります)

結果的には実装メインになってしまったので理論は他で補っていだたければと思います。

## 前提知識
- pythonの基礎。
- ディープラーニングの大雑把な概要。
- 機械学習の簡単な経験やイメージ。　

その他諸々前提知識は私の気まぐれで更新します。

`畳み込みとDenceの簡単な違い。
`
共通部分：どちらも同じディープラーニングの手法。


<details><summary>多層パーセプトロン</summary><div>
こんなやつ。Denceが特徴。

```python
model.add(Dense(units=num_middle_unit, activation='relu'))
```
入力層/中間層(隠れそう)/出力層で構成され、それぞれが<font color="red">全結合</font>されている。隠れそうがあるから多層なんです。
基本で単純なディープラーニング。



</div></details>




<details><summary>畳み込み層Convolutional layer ⇒ CNN</summary><div>
こんな形状(Conv2D)で、<font color="red">プーリング層</font>もある。

```python
model.add(Conv2D(64, (3, 3), activation='relu'))
```

ある程度の概要は[こちらのcolab](https://colab.research.google.com/drive/1_z7GZjTfP1HvVREmmDeJ6X1LT1XqvwC7?usp=sharing)に記載されております。

</div></details>

他にもRNNやLSTN等様々なディープラーニング手法がある。
参照はこちら。

https://qiita.com/ishizakiiii/items/4ea799a47f70a45b687c



<details><summary>model.summary()は何を見ているの？</summary><div>
これからちょくちょく登場するモデルサマリー。どのような意味なのでしょうか？

![summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/962d111b-2997-a88b-61f7-0850a079f12e.png)




![2022-08-31_14h18_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/a47cf5a5-5d5c-d4bc-e1a6-ff318cfd15cd.png)



</div></details>

## 実装

早速実装していきましょう。資料の保存方法はこちら
マージするのはやめてくださいね。
![2022-08-19_01h17_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/79c8d85d-6624-b4a0-fe6b-27bdf21f3e06.png)

### 難易度★☆☆☆
[ディープラーニング](https://github.com/Ken-huea/image-recognition/blob/main/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0_mnist_Good.ipynb)　によるmnist分類。⇒ 結構分かりやすくできたと自負しております。最初にイメージを掴んで頂ければ。　
例：手書き数字の画像(8)をAIが判断して予測を返す("これは8です")。

[CNNにおける分類(mnist)](https://github.com/Ken-huea/image-recognition/blob/main/CNN%E5%88%86%E9%A1%9E(mnist)%E2%91%A1.ipynb)　ほぼほぼ上と同じですが、理論の補足や学習モデルが異なっております。２つセットでどうぞ。

[上二つの資料はこちら](https://github.com/Ken-huea/image-recognition/blob/main/img_9%20(1).jpg)

[CNNにおける分類(cifer10)](https://colab.research.google.com/drive/1nH30neo6xC-cXpI1MR0RtMOXH96WRTzg#scrollTo=slg2PuzORW_J&uniqifier=1)　もう少し精度の向上が必要。

### 難易度★★☆☆

[CNNと転移学習(cifer10)](https://github.com/Ken-huea/image-recognition/blob/main/CNN%E3%81%A8cifar10.ipynb)
VGG16というモデルをダウンロードして分類に用います。それとモデルの保存と読込。

[自前のモデル読込](https://github.com/Ken-huea/image-recognition/blob/main/%E8%87%AA%E5%89%8D%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E8%AA%AD%E8%BE%BC.ipynb)　自分で保存した学習図済みモデルをcolabにアップロードし予測を行っております。使用教材はmnistの数値予測です。　こうする事により学習の手間やモデル構築の手間が軽減されることが期待できます。　[モデルはこちら](https://github.com/Ken-huea/image-recognition/blob/main/model%20(2).h5)

### 難易度★★★☆

[CNN(cifer10)の画像増殖](https://github.com/Ken-huea/image-recognition/blob/main/cifer10_%E7%94%BB%E5%83%8F%E5%A2%97%E6%AE%96_%E5%AD%A6%E7%BF%92.ipynb)⇒データが沢山ある場合は問題ないのですが、少ない場合はどうしましょう？限られた資源の中で最大限の効用を発揮するにはあらゆる工夫をしなければなりません。例えば｢画像データが１００枚しかないならばその１００枚を水増しして１０００枚に｣。


[男女識別](https://github.com/Ken-huea/image-recognition/blob/main/%E7%94%B7%E5%A5%B3%E8%AD%98%E5%88%A5%E5%AE%9F%E8%A3%85%E2%91%A0.ipynb) ⇒ 同じ分類ですが、よりイメージが湧きやすいかと。今までの資料を参照すれば決してできないものではないので是非力試しに。　[Qiita](https://github.com/Ken-huea/image-recognition/blob/main/%E7%94%B7%E5%A5%B3%E8%AD%98%E5%88%A5%E8%B3%87%E6%96%99(mini).zip)

[男女識別の画像増殖](https://colab.research.google.com/drive/1YfdV12JMaE6CJnKWaoHaQdC-C6hIiSqG)⇒試してみたけど、思ってた以上に成果は伸びず…　
`batch size 128だとtestデータでのloss： 0.776　testデータでのaccuracy： 0.8015　SGD`


[手書き分類](https://github.com/Ken-huea/image-recognition/blob/main/%E6%89%8B%E6%9B%B8%E3%81%8D%E6%95%B0%E5%AD%97(kaggle)%E2%91%A0.ipynb)　こちらもmnistとは基本的な思考は同じですが、より複雑にデータを扱っております。興味があればどうぞ。[資料はこちら](https://github.com/Ken-huea/image-recognition/blob/main/kaggle-20220916T071654Z-001.zip)



---
こちらは調整中。
[画像増殖②](https://colab.research.google.com/drive/1Jrsr01jtqeHUER1hVqlHkhLgW9uuOwbF#scrollTo=2LUtDW7CRbvJ)　　[手書き分類kaggleのCNNのみ](https://colab.research.google.com/drive/1X7Hlv2GgKrXta1dASHLfvGwzRyrLB8Nt#scrollTo=yQOlWIqYPEJi)

## その他メモ

<details><summary>前処理について</summary><div>
mnistとcifar10、同じディープラーニングで分類なのに、若干前処理が異なりますよね。
正規化を求められたり画像の調整を求められたり。これは整合性を取るための物なので、
エラー内容やモデルの種類によって柔軟に対応して頂ければと思います。
ちゃんとエラーを解消する為の処理。
ニューラルネットワークは正規化しなければなりません。

</div></details>


<details><summary>様々な精度向上テクニック</summary><div>

ディープラーニングのモデル構築の際に使用する精度向上が期待できるハイパーパラメータ。詳しくは[こちらの動画の後半](https://www.youtube.com/watch?v=i9CoY-2Q1v8)

- ミニバッチ学習
ニューラルネットは、データが増えれば増えるほど、1epoch毎の計算時間が多くなるため、全てのデータを使って、勾配(重み)を更新していては、非効率的である。そのため、全データから、ランダムに任意の個数のデータを抽出し、学習させると、扱うデータ量が減り、計算速度が向上し、限られたリソースで、多くの勾配(重み)を更新できる。


- 重み更新法の変更
今まで使用してきたSGDは確率的勾配降下法と呼ばれるもので、その他にも、「Adam」「RMSprop」「Adagrad」「Adamax」「Nadam」などがある。

![2022-09-01_17h25_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/589597b9-c67e-d554-c547-cc8c85f72185.png)

- ドロップアウト
一定の確率でランダムにニューロンを無視して学習を進めることで、過学習を押さえ、汎化性能の高いモデルを作ることができます。

- Batch Normalization：バッチ正規化
基本的には、勾配消失・勾配爆発を防ぐための手法であり、これまでは、活性化関数の変更・学習係数を下げる・DropOut層の追加などで対応してきたが、Batch Normalizationは、ミニバッチの各出力を正規化させ、学習過程の安定と学習速度の向上を実現した。

![2022-09-01_17h26_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/f7ce2099-9f25-82a8-153c-542b631a4692.png)


</div></details>

学習(callback関数)については[こちらを参照](https://qiita.com/The_Boys/items/284b250869fb380bc125)

## 終わりに
正直数学的な前知識も必須だろし気が乗らないなーとは思っていたのですが、
やってみると案外楽しく実装できました。大変だったのはshapeをちゃんとそろえる事。
沢山のエラーを解決しここまでこぎつけましたが、結局いt版多いのはshpaeの問題でしたので。少しでも学習のお役に立てば幸いです。

宜しければ時系列versionもありますのでいかがでしょうか。

https://qiita.com/The_Boys/items/40233521bf8d7fe82093