たかおLab

CNN(Convolutional Neural Network)とは?

機械学習
CNNのイメージ画像

CNNについて色々調べたので,備忘録として残します.

なぜCNNが必要なのか?

 

まず,もしDNNを画像の学習器として使う場合,下の図のように,

 

画像の各ピクセルの濃度を2次元の並びから1次元の配列に変換し,

その各ピクセルの濃度を,各ノードへの入力値とすると思います.

 

(DNNについては前回書いたので,こちらの記事を参照してください.)

 

 

(http://hokuts.com/2016/12/13/cnn1/)

 

 

しかしこの方法だと問題があります.

 

DNNへの入力の際のずれ

 

(https://qiita.com/icoxfog417/items/5fd55fad152231d706c2)

 

 

2次元の画像を1次元の配列に変換しているので,

例えば上の図のように,画像に映っているものがたった1ピクセルずれただけでも

入力が大きく変わってしまいます.

 

CNNではこの問題を解決しています.

 

 

 

CNN(Convolutional Neural Network)

 

CNN(Convolutional Neural Network)の基本的なネットワーク構造は以下のようになっています.

 

CNNのネットワーク

(https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

 

 

 

畳み込み層(Convolutional layer )

 

畳み込み層(Convolutional layer )では,入力画像に対して複数のフィルタをスライドさせ,特徴を抽出します.

 

以下に例を示します.

 

(使用する図はこちらにあるものです.このサイトの方が断然分かりやすいと思います(笑))

 

 

入力画像です.

 

入力画像

 

 

フィルタです.これは複数存在します.

 

フィルタ

 

 

入力画像に対してフィルタを重ね,同じ位置の値同士を掛け合わせ,

それらを足し合わせたものを特徴マップ(feature map)に出力します.

 

畳み込み時のイメージ

 

 

この処理を,フィルタをスライドさせるたびに行い,入力画像の特徴を得ます.

 

フィルタに設定された値によって,入力画像からどのように特徴を抽出するかが変わります.

 

CNNの学習では,このフィルタの値を最適化していきます.

 

次に,畳み込み層に関係する要素である,ストライドとゼロパディングを説明します.

 

 

ストライド

 

ストライドとは,フィルタをスライドさせる際の移動幅のことです.

ストライド

(https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

 

上の図は,ストライド=2のときの例です.

 

これにより,出力される特徴マップのサイズを調整することができます.

 

 

 

ゼロパディング

 

普通に畳み込みを行うと,入力画像の端の領域は他の領域に比べて

畳み込まれる回数が少なくなってしまいます.

 

これの対処として,ゼロパディングという処理を行います.

 

ゼロパディングは,下の図のように入力画像の周囲の領域を0で埋める処理のことです.

ゼロパディング

(https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

 

これにより,入力画像の端の領域の畳み込み回数が増えるので,その部分の特徴も抽出されやすくなります.

 

また,出力される特徴マップのサイズや層(畳み込み層とプーリング層)の数の調整もすることができます.

 

 

以上で説明した畳み込み層で特徴を抽出した後,次のプーリング層でサイズを縮小させます.

 

 

 

プーリング層(Pooling layer)

 

プーリング層では,特徴として重要な情報を残しながら,入力画像サイズの縮小を行います.

 

下の図のように,入力画像を何等分かに分け,それらの各領域ごとの最大値を取って圧縮します.

 

max pooling

(https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

 

ちなみに,これは max pooling という手法で,他にも平均値をとる手法もあるらしい.

 

プーリングにより,

 

・微小な位置変化に対して頑強(robust)になる.

・ある程度,過学習を抑制できる.

・計算コストが下がる.

 

といったメリットがあります.

 

 

以上で説明した畳み込み層とプーリング層で,特徴抽出 → 圧縮 → 特徴抽出 → 圧縮 → ・・・

を繰り返していき,最終的に得られた特徴マップたちを全結合層へ入力します.

 

 

 

全結合層(Fully Connected layer)

 

全結合層(Fully Connected layer)とは,下の図の右のように,ノードからノードにすべて結合する層です.

 

対して,下の図の左のように,部分的に結合するのを非全結合と言います.

 

全結合と非全結合

(https://products.sint.co.jp/aisia/blog/vol1-16)

 

 

つまり,畳み込み層 → プーリング層の繰り返しで最終的に得られた特徴マップ上の各値すべてが,

次の層の各ノードへ入力されるということ.

 

その入力をもとに,特徴マップが何を表しているか(「入力された画像は〇だ」「×だ」など)を出力します.

 

ただ,全結合は計算が膨大になってしまうので,畳み込み層では非全結合を採用しています.

 

次は,このCNNを利用した物体検出について書きたいと思います.