Python DeepLearningに再挑戦 21 畳み込みニューラルネットワーク
概要
Python DeepLearningに再挑戦 21 畳み込みニューラルネットワーク
参考書籍
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
全体の構造
ニューラルネットワーク+Convolutionレイヤ(畳み込み層)+Poolingレイヤ(プーリング層)が登場人物。
全結合:ニューラルネットワークのように隣接する層のすべてのニューロン間で結合がある構造。Affineレイヤで実装した。
- 出力に近い層ではAffine-ReLUに戻る。最後の出力層は、Affine-Softmaxの組み合わせが使われる。
畳み込み層
3次元のデータなどになるため、これまでの全結合ネットワークとは違ってくる。
全結合では、28x28の画像データなども、1次元に戻して計算していたが、畳み込みでは形状を維持したまま計算できる。
CNNでは、畳み込み層の入出力データを、特徴マップ(入力データを特徴マップ、出力データを出力特徴マップ)という。
畳み込み演算
- 畳み込み演算は、画像処理でいうところのフィルター演算に該当する。
上記の図の例では、3x3の部分を少しずつスライドして、対応する要素を乗算し、その和を求める。(積和演算と呼ばれることあり)
さらにそこにバイアスを加算する。
パディング(padding)
- パディング:入力データの周囲に固定のデータ(例えば0など)を埋めること。幅1のパディングとは、周囲を幅1ピクセルの0で埋めること。
上記の例では、(4,4)サイズの入力データは、パディングで、(6, 6)の形状になる。これにより、(3, 3)のサイズのフィルターをかけると、(4,4)のサイズの出力データが生成される。
パディングを使う理由の1つは、出力サイズの調整のため。
ストライド
自然言語処理における畳み込みニューラルネットワークを理解する · けんごのお屋敷
パディングとストライドの計算
- 入力サイズ=(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次元の場合は、チャンネル数を入力データと同じにする必要があり。
ブロックで考える。
この例では、データ出力は、1枚の特徴マップになっている。チャンネル数が1の特徴マップ。
畳み込み演算の出力を、チャンネル方向にも複数持たせるには、複数のフィルター(重み)を用いる。
- 畳み込み演算のフィルターについては、個数も考慮する必要があり。4次元のデータになる。
バッチ処理
イメージにするとなんとなくわかった気になるけど、実装は難しそうだなぁ(^ ^;)