ディープラーニングについてディープにラーニング。

思いっきり、自分が学んだことのアウトプットしていきますが、何分初心者。もし何かアドバイス等頂けましたら幸いです!

畳み込みニューラルネットワーク(CNN)

やっと来た7章。

ついにCNNについて学びます。

CNNとニューラルネットワークの違いは?

CNN→畳み込み層とプーリング層があること(プーリング層については別の記事で)
f:id:kawam0t0:20191222125520p:plain


NN→ない。全結合層のみ(Affine層)
全結合っていうのは、隣接する層のすべての間でニューロンが結合された状態

f:id:kawam0t0:20191222125507p:plain


この図が個人的には鬼わかりやすくって、
NNの時はAffine-RELUの組み合わせだったのがCNNになるとConv-RELU-Poolingの結合になる。
あ、Poolingはたまに省かれることもある。

ただ、似ているところは、最後の出力層近くのところにはAffine-RELU(全結合)が入って、
最後には、これまでと同じ、SOFTMAXも入ってくる。

では、実際に構造はどうなってるんだ?

畳み込み層について

ニューラルネットワークでは全部の層は全結合されていた。
隣接する層のニューロンはすべてつながっているので、出力の数は任意に決めれる。いうことなし!
って思いきや、弱点があった。

全結合するときに、すべてのデータの形状が無視されて、フラットな形状になる。

たとえ話~

縦400横300の2人の人間が移った写真をイメージ。
この写真の情報は(3, 400, 300)の3次元の形状になる。
これをフラットにしてしまうので、どこに、だれがどんな感じで映ってるのか
わかりにくくなっちゃう、っていう致命的な問題があった。

これを改良したのが畳み込み層の存在だった。
つまりは3次元で入ってきたデータは3次元のまま受け取って、3次元のまま出力をしてくれる。

畳み込み演算

では、そんなとてもとても賢い畳み込み層。
どうやって計算してんの?って話。

f:id:kawam0t0:20191222130643p:plain

畳み込み演算は入力データに対して、フィルター(NNで言う重み)を使う。
この例では、
入力サイズを(4,4)、フィルターサイズを(3,3)、出力サイズを(2,2)で考えてみる。

f:id:kawam0t0:20191222131015p:plain

①入力データに対して、まず、フィルターサイズと同じ(3,3)をあてがう
②フィルターの該当箇所と入力データの該当箇所がマッチしているところを掛け算
③掛け算した合計を足算して、出力データにはめ込む。
これを出力サイズに合わせて繰り返す。

上記の通り、CNNの場合、重みとなるのはこのフィルター。
でもバイアスがまだかかっていないので、
一応例として3のバイアスとしておこう。

f:id:kawam0t0:20191222131305p:plain

これのようにフィルターで重みを付けて、
バイアスを足算し、演算を行っている。


次回はパディングについて書きます。

ではまた。