Convolutional Neural Networks で畳み込みとプーリングのときに画像サイズが小さくなっていきますが,サイズの変化の仕方について疑問があったので書き残しておきます.
公式
処理後の画像サイズを求める公式みたいなのが一応あります.
W:imagesize,F:filtersize,P:paddingsize,S:stridewidth としたときに
W′=SW−F+2×P+1
サイトによっては
W′=S⌊W−F+2×P⌋+1
で算出されるとなっているのを見かけますが,考えてみるとたぶん
W′=S⌈W−F+2×P⌉+1
ですよね.
実際に計算してみる
MNIST
元の画像は 2828 で,プーリング層を二回経て画像が小さくなっています.フィルタサイズは 2×2 ,ストライド幅が 2 なので,最終的な出力は 7×7 になります.
AlexNet
元の画像が 224×224 で,最初の畳み込み層に入力する前にストライド幅 4 で 11×11 のフィルタにかけられ,55×55 になるはずです.
4224−11+1=54.3...
4⌊224−11⌋+1=54
となるので,床関数ではなく天井関数を適用するのが正しい気がします.
4⌈224−11⌉+1=55
TensorFlow での実行
169×169 の画像をストライド幅 3 で 7×7 のフィルタにかけたら 57×57 になっているんですが,上式ではどう頑張っても 55 にしかなりません.
どこかで実行間違ってたんですかね...