ytbilly3636’s 研究備忘録

機械学習,Python,ガンダムなど

畳み込み後プーリング後の特徴マップの大きさ

こんにちは.

畳み込みやプーリングの後の特徴マップの大きさってどうなるんだっけ? と毎回考え込んでしまうので,メモしておきます.

{ \displaystyle
k + s(n-1) = w + 2p
}

上記の式を満たす整数nが処理後の特徴マップの幅になります. kカーネルサイズ,sストライド量,wが処理前の特徴マップの幅,pがパディング量になります.

確かめてみませう.

適当な入力を用意して,畳み込みとプーリングをした後のサイズをチェックしてみます.

# -*- coding: utf-8 -*-
import numpy as np
import chainer
import chainer.functions as F
import chainer.links as L
from chainer import Variable

# 畳み込みの設定
conv = L.Convolution2D(
    in_channels  = 1,
    out_channels = 20,
    ksize        = 5,
    stride       = 1,
    pad          = 2
)

# グレースケール32x32の入力画像を1枚
input_array = np.ones((1, 1, 32, 32), dtype=np.float32)
x = Variable(input_array)

# 畳み込み処理
# 5 + (n-1) = 32 + 2*2
# n = 32
conv1 = conv(x)
print conv1.data.shape

# プーリング処理
# 3 + 2(n-1) = 32
# n = 15.5
pool1 = F.max_pooling_2d(conv1, ksize=3, stride=2, pad=0)
print pool1.data.shape

結果

(1, 20, 32, 32)
(1, 20, 16, 16)

畳み込みは思い通りになりました.

プーリングは計算式に入れたところ,nは整数になりませんでした.この場合,余ったピクセルの処理は畳み込みやプーリングの実装に依存するところだと思いますが,Chainerの場合四捨五入しているのでしょうか.