Convolutional Neural Networkについて直感的に理解する

現在私は深層学習を勉強していて、CNN(Convolutional Neural Network)について学んだことをアウトプットするために今回Qiitaに投稿することにしました。<br>


# CNN（Convolutional Neural Network）とはなんなのか


Convolutional Neural Network(畳み込みニューラルネットワーク)

- 深層学習の応用的な手法の一つ<br>
- 画像認識で特に優れた実績を収めている

<br>

# CNNがなぜ画像認識に適しているのか

- CNNは生物の脳の視覚神経系からヒントを得たニューラルネットワークの一種である<br>
- CNNは視覚系における受容野をモデル化している<br><br><br><br>

では実際に受容野のモデルを見てみましょう

<br>



視覚系における受容野モデル
<img width="324" alt="スクリーンショット 2018-01-23 17.10.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/8ccddedd-c97f-3fb3-ca21-aa5e313b8439.png">

[Deep learningで画像認識③〜ネオコグニトロンとは？〜](https://lp-tech.net/articles/fbf5j)

<br><br>


ここで図中のS層C層は以下の役割をしています<br>


|S層 (単純細胞層 – simple cell)|図形の特徴を抽出|
|:--:|:--:|:--:|
|C層 (複雑細胞層 – complex cell)|位置ズレを吸収する|

<br><br>

上の図は何をしているかというと、
__入力された情報はS層とC層が交互に結合する構造により、 『S層による特徴抽出』と『C層による位置ずれの許容』を繰り返しながら上位の各層に伝搬される様子__を表しています

<br>

CNNでは『S層』を『畳み込み層』として、『C層』を『プーリング層』として実装しているため__CNNは画像認識に適している__と言われているのです<br><br><br>



||視覚系における受容野|Convolutional Neural Network|
|:--:|:--:|:--:|
|図形の特徴を抽出|S層 (単純細胞層–simplecell)|畳み込み層|
|位置ズレを吸収する|C層 (複雑細胞層–complexcell)|プーリング層|

<br><br>


では次にConvolutional Neural Networkにおける畳み込み層とプーリング層について見ていきましょう<br><br>


# 畳み込み層の役割
CNNは入力のあらゆる位置で特徴の比較と一致点の検出を試み、
画像全体にわたって特徴の一致件数を計算し特徴マップを作成します。
この時に実行する演算が__畳込み__といい、__畳み込みニューラルネットワーク__の名称の元となっています。

<br>


### 畳み込みの計算方法
1. 特徴の各ピクセルを画像内の対応するピクセル値で掛ける
2. 答えを合計し、特徴のピクセルの総数で割る


両方のピクセルが白(値が1)なら1×1=1、両方が黒なら(-1)×(-1)=1となり、
ピクセルが一致する場合の計算結果は全て1で、一致しない場合は全て-1となります

<br><br>

文字だけではわかりづらいので、実際に計算してみましょう<br><br>


まず入力画像・フィルター・特徴マップを用意します。

<br>
<img width="414" alt="スクリーンショット 2018-01-23 17.56.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/96f7cc3b-9ff7-0fb6-79e0-f976cd711fe4.png">

<br>

入力画像をフィルターを使って畳み込み、特徴マップを埋めていくことが目標となります。

<br>



<img width="413" alt="スクリーンショット 2018-01-23 17.56.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/5576d9e8-e132-2a85-989d-fbb6eaba13a3.png">

<br>


最初に入力画像の一部の赤枠で囲まれた部分をフィルターを使って畳み込んでみます

<br>

計算前
<img width="436" alt="スクリーンショット 2018-01-23 18.01.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/5d9e715b-9240-7acf-5304-c84e1677a547.png">

<br>

計算後
<img width="444" alt="スクリーンショット 2018-01-23 18.01.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/9b50c526-b4ed-5f43-f44b-8d70e7b10381.png">

<br>

入力の一部の画像ピクセルとフィルターのピクセルを、左上から対応するピクセルごとに掛け合わせていき、足し合わせ、

> -1×1 = -1
-1×-1 = 1
-1×-1 = 1
-1×-1 = 1
1×1 = 1
-1×-1 = 1
-1×-1 = 1
-1×-1 = 1
1×1 = 1


>(-1) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 7



画像のピクセル数（今回は9）で割り、結果を特徴マップに書き込みます
>7 ÷ 9 = 0.77

<br>

<img width="422" alt="スクリーンショット 2018-01-23 18.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/eba14b5f-dd2b-cd66-2f22-041ae7148062.png">

<br>

フィルターを徐々にスライドさせていき、同様に特徴マップに書き込んでいきます

<br>



<img width="424" alt="スクリーンショット 2018-01-23 18.16.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/f5fe7f7c-2eaf-bc2d-8662-c8aa3fb6a265.png">

<img width="422" alt="スクリーンショット 2018-01-23 18.17.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/63733dae-f3c5-636b-9d5c-caf7164da2c4.png">

<img width="421" alt="スクリーンショット 2018-01-23 18.17.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/be38cc2c-ab0e-aee8-a671-0e80f0b1612c.png">


<br>

特徴マップを埋め終わったら畳み込みは終了です








# プーリング層の役割

- 畳み込み層から出力された特徴マップを縮小し、新たな値を求める
- 大きな画像を重要な情報は残しつつ縮小する方法
- 画像内を小さなウィンドウに区切り、区切ったそれぞれのウィンドウから最大値を取る(max pooling)

<br>


<img width="367" alt="スクリーンショット 2018-01-23 18.23.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/be99eef2-3891-1862-66f3-19fafb1c7b04.png">


<br>

結果として出力される画像枚数は同じだが、それぞれのピクセル数が減少し、
計算の負荷を管理するのにとても便利です

<br>

<img width="244" alt="スクリーンショット 2018-01-23 18.23.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/203246/f7c57605-8cbd-e467-0cde-fbaef9d74df3.png">




<br><br><br><br>


以上となります。
不適切な点や、誤りがありましたらご指摘いただけると幸いです。