プーリング処理による画像サイズの変化について

Convolutional Neural Networks で畳み込みとプーリングのときに画像サイズが小さくなっていきますが、サイズの変化の仕方について疑問があったので書き残しておきます。

スポンサーリンク

公式

処理後の画像サイズを求める公式みたいなのが一応あります。

\[W:\,image\,size\]

\[F:\,filter\,size\]

\[P:\,padding\,size\]

\[S:\,stride\,width\]

としたときに

\[W’=\frac{W-F+2\times P}{S}+1\]

サイトによっては

\[W’=\frac{\lfloor W-F+2\times P\rfloor}{S}+1\]

で算出されるとなっているのを見かけますが、考えてみるとたぶん

\[W’=\frac{\lceil W-F+2\times P\rceil}{S}+1\]

ですよね。

実際に計算してみる

MNIST

元の画像は 28 * 28 で、プーリング層を二回経て画像が小さくなっています。フィルタサイズは 2 * 2 、ストライド幅が 2 なので、最終的な出力は 7 * 7 になります。

AlexNet

元の画像が 224 * 224 で、最初の畳み込み層に入力する前にストライド幅 4 で 11 * 11 のフィルタにかけられ、55 * 55 になるはずです。

\[\frac{224-11}{4}+1=54.3…\]

\[\frac{\lfloor 224-11\rfloor}{4}+1=54\]

となるので、床関数ではなく天井関数を適用するのが正しい気がします。

\[\frac{\lceil 224-11\rceil}{4}+1=55\]

TensorFlowでの実行

169 * 169 の画像をストライド幅 3 で 7 * 7 のフィルタにかけたら 57 * 57 になっているんですが、上式ではどう頑張っても 55 にしかなりません。

どこかで実行間違ってたんですかね…

スポンサーリンク

コメント・質問する