畳み込み後プーリング後の特徴マップの大きさ
こんにちは.
畳み込みやプーリングの後の特徴マップの大きさってどうなるんだっけ? と毎回考え込んでしまうので,メモしておきます.
上記の式を満たす整数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の場合四捨五入しているのでしょうか.