Python
機械学習
DeepLearning
CNN
TensorFlow

【入門者向け解説】プーリング処理入門(TensorFlowで説明)

More than 1 year has passed since last update.

入門者向けに「プーリング」処理について解説

TensorFlowエキスパート向けチュートリアルDeep MNIST for Expertsを実行して、「畳み込み」と同様にわかりにくいのが「プーリング」処理でした。畳み込みと同様に文系卒からすると一般用語でもないですし、少しつまづきましたが、分かれば簡単です。畳み込みと違ってフィルタを使わないため、畳み込みよりも簡単です。
「【入門者向け解説】TensorFlowチュートリアルDeep MNIST」記事で、畳み込みニューラルネットワークの処理について、「【入門者向け解説】畳み込み処理入門(TensorFlowで説明)」で畳み込み処理に特化したを解説していますので参考にしてください。
※TensorBoardで出力した画像を参考に載せました(2017/7/27)

概説

概要

「【入門者向け解説】TensorFlowチュートリアルDeep MNIST」の記事で解説しましたが、「プーリング」処理では画像の特徴を粗く整理します。画像だけでなく音声やデータでもいいですのですが、画像の方が視覚的でわかりやすいので、画像を使って解説します。
10.Overview.JPG

プーリング処理の入出力

畳み込み処理は特徴を出すためにフィルターをかけます。画像をインプットとしてフィルターを使って、フィルターの枚数分の画像を出力します。MNISTデータを使った場合は、下記のとおりです。
10.Pooling_Overview01.JPG

TensorBoardに出した実際のプーリング処理入出力画像を整理したらこんな感じでした。畳み込み処理と違って、荒くしているだけなのでわかりやすいです。
30.Pooling_image.JPG

具体的な処理

TensorFlowエキスパート向けチュートリアルDeep MNIST for Expertsの以下の箇所がプーリング処理です。第1層でも第2層でも同じです。TensorFlowのAPIを使うことでこの程度で実装することができます。

# Max Pooling
def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

画像例

入力画像例として縦4×横4×1色(黒のみ)の斜め棒画像を使って、プーリング前に畳み込み処理をした場合は以下の結果となります。結果をわかりやすくするために、"1"と"-1"の2つで表現しています。
20.Pooling_Convolve01.JPG

Max Pooling

では、本題のプーリングです。TensorFlowエキスパート向けチュートリアルDeep MNIST for Expertsではプーリングの種類として、Max Poolingを使っています。Max Poolingは各範囲で最大値を選択して圧縮するだけです。
20.Pooling02_MaxPool.JPG
図にあるように、斜め棒の特徴が4(縦)×4(横)から2(縦)×2(横)に特徴を残したまま半分に圧縮できました。これが、「特徴を粗く整理」と表現していた内容です。
ちなみに平均プーリングもあって、その場合は下図のとおりです。
20.Pooling03_AvePool.JPG