kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

7章 畳み込みニューラルネットワーク 畳み込み層Convolution layerとプーリング層Pooling layer『ゼロから作るDeep Learning』

f:id:kaeken:20161113135225g:plain

さて、いよいよ畳み込みニューラルネットワークConvolution Neural Network, CNNまで来た。

最新の画像認識・音声認識でほぼ使われているCNNをじっくり理解していく。

CNNでは、今までのレイヤに、

畳み込み層Convolution layer

プーリング層Pooling layer

の2つを追加する。プーリング層は省略されることがある。

今までのNNでは、全結合層Affine layer

で隣接する層のすべてのニューロン同士が結合されていた。

全結合層の問題点として、

データの空間的情報が消えてしまう問題がある。

具体的には、MNISTデータ・セットのように、

入力画像の3次元構造(チャンネル、縦、横)が、

1次元構造にされてAffine layerに入力される。

空間的に近接したピクセル同士の関係情報が消えてしまう。

ここで、

畳み込み層Convolution layerを使えば、空間情報が維持される。

なお、

畳み込み層の入出力データを特徴マップfeature mapとも言う。

入力特徴マップinput feature map

出力特徴マップoutput feature map

続いて、畳み込み演算(画像処理ではフィルター演算)について。

畳み込み演算は、縦・横の形状をした入力データに対して、フィルターを適用する。

以下、(height, width)として、フィルタのウィンドウを一定間隔で移動させながら、積和演算を行い、対応する出力場所へ格納する。

入力データ:(4,4)
1230
0123
3012
2301

フィルターサイズ:(3,3)
201
012
102

出力サイズ:(2,2)
  1x2 + 0x0 + 3x1
+ 2x0 + 1x1 + 0x0
+ 3x1 + 2x2 + 1x2
= 15→出力左上
以下同様
15 16
 6 15

イメージ図のとおり、入力データにフィルタをスライドさせながら積和演算し出力する。

f:id:kaeken:20161113135225g:plain

畳み込み演算のフィルタは、重みに相当し、(1,1)のバイアスも付加してデータを出力する。

また、

パディングpaddingとは、畳み込み演算前に入力データの周囲に固定データ(0など)を埋める処理。

パディングを使う理由は、出力サイズが1になって演算が適用できなくならないように調整するため。

例えば、入力データ(5,5)に幅1のパディングを適用すると、

入力データが(7,7)に変わり、

(5,5)フィルタをかけると以下のとおり、スライド位置が増えて、(5,5)の出力となる。

f:id:kaeken:20161113135257g:plain

続いて、ストライドについて。

ストライドstrideとは、フィルタを適用する位置間隔。

今までの説明ではストライド1だったが、ストライド2にすると、ウィンドウが2要素ごと移動する。

f:id:kaeken:20161113135455g:plain

ストライドを大きくすると、出力サイズは小さくなり、

パディングを大きくすると、出力サイズは大きくなる。

以下関係式。

入力サイズ(H,W)
フィルタサイズ(FH,FW)
出力サイズ(OH,OW)
パディングP
ストライドS

OH(OW) = 1 + { H(W) + 2P - FH(FW) } / 2

※HとWは読み替える
※H(W) + 2P - FH(FW) の値は割り切れるように設定する

次に、3次元畳み込み演算について。

3次元畳み込み演算:2次元にチャンネルを追加したデータの畳み込み演算

(channel, height, width)

※必ず、入力データのチャンネル数とフィルタのチャンネル数は一致させる必要がある。

フィルタが複数個ある場合は、output_channelを追加した4次元データにする。

(output_channel, input_channel, height, width)

バッチ処理の場合も、バッチ数を追加した4次元データにする。

(batch_num, input_channel, height, width)

最後に、プーリング層について。

プーリングpoolingとは、縦・横方向の空間を小さくする演算。

(2,2)サイズ領域を、一定のルールで(1,1)サイズにするなど。

Maxプーリング:対象領域の最大値を残して集約する手法。(以下ではプーリング=Maxプーリングとする)

Averageプーリング:対象領域の平均を算出する手法。

プーリング層の特徴3つ

1.学習するパラメータがない

2.チャンネル数は変化しない

3.微小な位置変化に対してロバスト(必ずしも保証されない)

以上、Convolution / Poolingレイヤの説明で、

次は、実装に入る。