畳み込みニューラルネットワーク（CNN）まとめ

#はじめに

今回は、ディープラーニングの画像認識として有名な「畳み込みニューラルネットワーク（CNN）」についてまとめました。


🌟基本となるディープラーニングについて
https://qiita.com/hara_tatsu/items/c0e59b388823769f9704

🌟ディープラーニングの実装及び過学習対策
https://qiita.com/hara_tatsu/items/b7423e90574cf7730978

🌟畳み込みニューラルネットワーク（CNN）の実装
https://qiita.com/hara_tatsu/items/d2c6536ae35cca5e97ab

#畳み込みニューラルネットワークとは

##概要

畳み込みニューラルネットワークとは、一言で言うと「人間の視覚を基にして作られたモデル」。

通常のディープラーニングでは、元の画像全体をそのまま結合（１次元化）して学習させることが基本となる。

例えば、８×８の画像を分類するモデルを作成しようとしたとき、８×８の画像を１次元化（(８×８=)６４個の並んだ数値）してから学習する。

```
#イメージ図：1次元の数値(64,1)
array([ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.,  0.,  0., 13., 15., 10.,
       15.,  5.,  0.,  0.,  3., 15.,  2.,  0., 11.,  8.,  0.,  0.,  4.,
       12.,  0.,  0.,  8.,  8.,  0.,  0.,  5.,  8.,  0.,  0.,  9.,  8.,
        0.,  0.,  4., 11.,  0.,  1., 12.,  7.,  0.,  0.,  2., 14.,  5.,
       10., 12.,  0.,  0.,  0.,  0.,  6., 13., 10.,  0.,  0.,  0.])
```

上記のやり方だと、機械が画像全体から対象の特徴を正確に捉えることは難しく、満足の行く精度にはならなかった。

その最大の原因と考えられたのが、画像データ１次元化することで画像が持つ縦横の「位置情報が失われてしまう」こと。

これを解決するために、８×８の２次元の状態（画像データのまま）でモデルに学習させようとして生まれたものが、畳み込みニューラルネットワーク（CNN）。

※カラー画像であれば、３次元。

##学習の流れ

畳み込みニューラルネットワーク（CNN）を利用した画像処理の流れを簡単に説明すると、

①入力画像の全体に対して畳み込み層でフィルター処理を行い、特徴マップを作成。（画像データの特徴を際立たせる）

②処理した画像をプーリング層に流し込む。

③プーリング層で画像のサイズを下げる処理を行う。（次元削除）

④③の結果を用いて全結合層で結合することで、画像認識をする、という流れになります。

🌟参考図

![Qiita用-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672827/d1b25f79-892b-f5e9-c1d2-34fa43f17e6a.jpeg)



##畳み込み層とは

畳み込み層の役割を一言で表すと「データの特徴を際立たせる層」。

畳み込み層では、フィルターを用いて画像データから様々な特徴を際立たせる処理をしている。

人間が画像内の対象を識別する時、基本的には画像全体を見ずに何かしらの特徴を見つけて判断している。
そのため、人間の脳が特徴を見つけるのと同様に、畳み込み層で画像データの特徴を見つける（際立たせる）処理をしている。

また、特徴を抽出するために重要となるのが畳み込みフィルター。

###畳み込みフィルター

畳み込みフィルターとは一言で言うと、「特徴を際立たせる為のフィルター」。

特徴と言っても種類は様々あり、画像を鮮明にするフィルター、ぼかすフィルター、エッジを際立たせるフィルターなど沢山ある。

###畳み込み層での流れ

🌟参考図

![Qiita用-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672827/e5f9ec79-c207-be76-fd33-55c6eccf5af0.jpeg)


画像データの左上からフィルターを適用していき、特徴マップを作成していきます。
具体的にどう計算されているかというと、
(1×0)+(2×1)+(3×1)+(4×0)=5 です。

そして、フィルターの適用箇所を１つ右にスライドしていく。
(2×0)+(7×1)+(4×1)+(1×0)=11

※右端まで到達したら次は青枠の箇所のように1つ下がる。

###✅畳み込み層で重要なこと
・フィルターが通常のディープラーニングでいうところの「重み」。
・フィルターの数とサイズは人間が設定する。
・フィルターの数だけ画像データから特徴マップが生み出される。
・特徴マップのサイズは元の画像より少し小さくなる（元画像とフィルタのサイズによってサイズが変わる）。 
・フィルターの数値は自動作成され、学習により変わってゆく（誤差逆伝搬）。 
・画像全体をフィルターがスライドするので、特徴がどこにあっても抽出できる（移動不変性）。 

##プーリング層とは

特徴を残しながら、情報の量を減らす処理をする。（次元削除）
（画像サイズを決められたルールで小さくする）

🌟参考図

![Qiita用-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672827/9fd6ec60-eaff-cee7-9b42-9dc3ad7ff9d4.jpeg)


畳み込み層とは違い、左上から順に決められた領域の中の最大値を抽出（Maxプーリング）します。

###✅プーリング層で重要なこと
・情報を失わずに画像サイズを圧縮する。
・パラメーター数を削減。
・計算コストを削減している。
・最大値でなく平均値を抽出する方法もあるが、特徴のあるデータを残したいという目的があるので一般的に最大値を抽出する。
・画像データの平行移動に対する頑健性。
（写っている物体が少し横に移動した画像データでも同じものとして扱うことができる。）


##畳み込みニューラルネットワーク（CNN）の特徴

・移動不変 ：特徴のあるデータが画像のどこにあっても抽出できる。つまり、位置によらず判断が行えることを 移動不変。

・抽象化 ：フィルタを適用することで、単純に基の画像からは得られないような特徴を抽出する。具体的にはエッジや輪郭などの特徴。

・重み共有 ：重みが共有されることでパラメータ数を減らせ、過学習が起こりづらくなります。

##畳み込みニューラルネットワークの発展モデル

###AlexNet

2012年に「ILSVRC」という画像認識コンペで圧倒的精度を出したモデル。
畳み込み層→プーリング層→畳み込み層→プーリング層→畳み込み層→畳み込み層→畳み込み層→プーリング層→全結合層（３層）となっている。

###VggやGoogLeNet

AlexNetをより深くしたモデル。
層を単純に深くしてしまうと計算量が膨大になってしまい、学習がうまく進まない問題が発生した。これを解決するために、小さいサイズの畳み込みフィルター（(1×1, 3×3)）を差し込んで次元（計算量）を削減する工夫が施された。

###ResNet

VggやGoogLeNetのおかげで層が深くなっても効率的な学習ができるようになったが、更に層を深くした「超」深層になると、誤差が逆伝播しにくくなり学習がうまくいかなくなる勾配消失問題が発生した。

これを解決するため、Skipconnection「層を飛び越えた結合」を加えたモデルが生まれた。
（層が深くなっても、層を飛び越える部分は伝播がしやすくなる。）


🌟参考図

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672827/5c698a24-fde0-7b84-941a-f4da67f302e2.png)


#おわりに

今回は、畳み込みニューラルネットワークについてまとめました。
次回は、畳み込みニューラルネットワークの実装をしていきます。