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

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 \times 2$ ,ストライド幅が 2 なので,最終的な出力は $7 \times 7$ になります.

AlexNet

元の画像が $224 \times 224$ で,最初の畳み込み層に入力する前にストライド幅 4 で $11 \times 11$ のフィルタにかけられ,$55 \times 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 \times 169$ の画像をストライド幅 3 で $7 \times 7$ のフィルタにかけたら $57 \times 57$ になっているんですが,上式ではどう頑張っても 55 にしかなりません.

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