前回は、プーリングの説明をした。
今回からは、プーリングの実装について書く。
といっても、僅かな変更を加えるだけである。
とりあえす、プーリングのサイズが2の場合を試す。
# Network definition
class CNN(chainer.Chain):
def __init__(self, n_units, n_out):
super(CNN, self).__init__(
conv1=L.Convolution2D(None, 36, 3), # 畳み込み
conv2=L.Convolution2D(None, 36, 4), # 畳み込み
l1=L.Linear(None, n_units[0]), # -> n_units[0]
l2=L.Linear(None, n_units[1]), # n_units[0] -> n_units[1]
l3=L.Linear(None, n_out), # n_units[1] -> n_out
)
def __call__(self, x):
c1 = F.relu(self.conv1(x)) # 畳み込み
c2 = F.relu(self.conv2(c1)) # 畳み込み
p1 = F.max_pooling_2d(c2,2) # プーリング
h1 = F.relu(self.l1(p1))
h2 = F.relu(self.l2(h1))
return self.l3(h2)
畳み込みでは、1層増やす毎に、__init__() と __call__() が1行ずつ増えたのだが、プーリングでは、__call__()の中に1行書き加えただけである。
畳み込みの2回目が終わって、全結合層に入る直前にプーリング層を入れている。
何も説明することがないくらい簡単で困る。
CIFAR-10$ python train_cifar4.py -g 0 -u 500 500
GPU: 0
# number: 50000
# units: [500, 500]
# Minibatch-size: 100
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 1.37013 1.07603 0.50554 0.6189 10.172
2 0.925518 0.927358 0.674221 0.6721 20.1767
3 0.702369 0.863335 0.75472 0.698 30.1597
4 0.497263 0.943865 0.826219 0.6971 40.1821
5 0.309668 1.07688 0.89288 0.6817 50.2104
6 0.190367 1.31478 0.934821 0.6863 60.2692
7 0.114691 1.6023 0.961002 0.6772 70.3088
8 0.0909024 1.62564 0.969121 0.6843 80.3344
9 0.081165 1.91912 0.973141 0.6817 90.3658
10 0.0655271 1.89566 0.9781 0.6801 100.399
11 0.0500345 2.14553 0.983081 0.6807 110.461
12 0.0604023 2.11143 0.980221 0.6803 120.45
13 0.0505119 2.14404 0.98318 0.6804 130.529
14 0.0511697 2.21828 0.98332 0.6772 140.634
15 0.0505931 2.21631 0.983 0.6765 150.707
16 0.0434303 2.23873 0.98596 0.6814 160.816
17 0.037501 2.39804 0.98786 0.6787 170.89
18 0.0337717 2.64839 0.989279 0.6776 180.98
19 0.0455601 2.3579 0.985121 0.6756 191.067
20 0.0406653 2.50223 0.98644 0.6817 201.16
CIFAR-10$
テスト精度がほぼ0.7まで上昇した。
前回は67%には届かなかったので、また約3%性能アップしたようだ。
さて、次は、どうしよう。
プーリング層を増やすか、それともプーリングのサイズを変えて効果の違いを探るか、やるべきことは色々ありそうだ。