読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python DeepLearningに再挑戦 21 畳み込みニューラルネットワーク

概要

Python DeepLearningに再挑戦 21 畳み込みニューラルネットワーク

参考書籍

全体の構造

f:id:riikku:20161226141944p:plain

  • 出力に近い層ではAffine-ReLUに戻る。最後の出力層は、Affine-Softmaxの組み合わせが使われる。

畳み込み層

  • 3次元のデータなどになるため、これまでの全結合ネットワークとは違ってくる。

  • 全結合では、28x28の画像データなども、1次元に戻して計算していたが、畳み込みでは形状を維持したまま計算できる。

  • CNNでは、畳み込み層の入出力データを、特徴マップ(入力データを特徴マップ、出力データを出力特徴マップ)という。

畳み込み演算

  • 畳み込み演算は、画像処理でいうところのフィルター演算に該当する。

f:id:riikku:20161226145014p:plain

  • 上記の図の例では、3x3の部分を少しずつスライドして、対応する要素を乗算し、その和を求める。(積和演算と呼ばれることあり)

  • さらにそこにバイアスを加算する。

f:id:riikku:20161226145735p:plain

パディング(padding)

  • パディング:入力データの周囲に固定のデータ(例えば0など)を埋めること。幅1のパディングとは、周囲を幅1ピクセルの0で埋めること。

f:id:riikku:20161226151028p:plain

  • 上記の例では、(4,4)サイズの入力データは、パディングで、(6, 6)の形状になる。これにより、(3, 3)のサイズのフィルターをかけると、(4,4)のサイズの出力データが生成される。

  • パディングを使う理由の1つは、出力サイズの調整のため。

ストライド

  • フィルターを適用する位置の間隔をストライドという。

  • ストライドを2にすると、フィルターを適用する窓の間隔が2要素ごとになる。図はこちらのサイトがわかりやすかったです!

自然言語処理における畳み込みニューラルネットワークを理解する · けんごのお屋敷

パディングとストライドの計算

  • 入力サイズ=(H, W), フィルターサイズ=(FH, FW), 出力サイズ=(OH, OW)、パディングをP, ストライドをSとする。
# 高さ+ パディング*2(両辺に+1となるため) - フィルターの高さ をストライドで徐算する。それに1を加算する。 
OH = (H + 2P-FH) / S + 1

OW = (W + 2P -FW) / S + 1
  • 入力サイズ:(4,4)、パディング:1, ストライド:1, フィルターサイズ:(3,3)
OH = (4+2*1 -3) / 1 +1 =4
OW = (4 +2*1-3) /1 + 1 = 4
  • 入力サイズ:(7, 7), パディング:0, ストライド2、フィルターサイズ:(3,3)
OH = (7+2*0-3)/2 + 1=3
OW =(7+2*0-3)/2 + 1=3 
  • 入力サイズ:(28,31)、パディング:2, ストライド:3, フィルターサイズ:(5,5)
OH = (28 + 2*2 - 5) /3 + 1=10
OW = (31 + 2*2 - 5) /3 + 1 = 11
  • 割り切れない場合は、エラーを出すか、近い整数に丸めてエラーをださずに進めるなどの方法がある。

3次元データの畳み込み演算

  • こちらの図がわかりやすかったです!

http://en.systemdesignjournal.com/wp-content/uploads/2015/07/internal_convolution_layers.jpg

  • 3次元の場合は、チャンネル数を入力データと同じにする必要があり。

ブロックで考える。

f:id:riikku:20161226161646p:plain

  • この例では、データ出力は、1枚の特徴マップになっている。チャンネル数が1の特徴マップ。

  • 畳み込み演算の出力を、チャンネル方向にも複数持たせるには、複数のフィルター(重み)を用いる。

f:id:riikku:20161226162653p:plain

  • 畳み込み演算のフィルターについては、個数も考慮する必要があり。4次元のデータになる。

f:id:riikku:20161226163910p:plain

バッチ処理

f:id:riikku:20161226164341p:plain

イメージにするとなんとなくわかった気になるけど、実装は難しそうだなぁ(^ ^;)