前回、畳み込み層を1層入れたら、10%精度が向上した。
ということは、もう1層追加したら、さらに精度が上がるかも知れない。
では、さっそく追加してみよう。
# 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, 3), # 追加行
l1=L.Linear(None, n_units[0]), # n_in -> 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)) # 追加行
h1 = F.relu(self.l1(c2))
h2 = F.relu(self.l2(h1))
return self.l3(h2)
変更は僅かであり、説明する必要もないだろう。
1層のときの出力チャネル数は48だったが、今回は36チャンネルにした。
チャネル数をいくつにするのがベストなのかよくわからないので、適当に値を変えて、一番良さそうな値を選んだだけであり、根拠はない。
では、早速走らせてみよう。
CIFAR-10$ python train_cifar3.py -g 0 -u 200 200 -e 20
GPU: 0
# number: 50000
# units: [200, 200]
# Minibatch-size: 100
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 1.4159 1.13834 0.48884 0.599 9.25972
2 0.97892 0.988769 0.65318 0.654 18.4154
3 0.746028 0.980138 0.73654 0.6667 27.5391
4 0.542533 1.07012 0.810679 0.66 36.6622
5 0.343509 1.23141 0.88124 0.6609 45.7941
6 0.203577 1.43938 0.930721 0.6502 54.9523
7 0.130787 1.79407 0.955861 0.6455 64.1065
8 0.10182 2.02728 0.965981 0.641 73.2419
9 0.0723793 2.26742 0.976501 0.6303 82.3618
10 0.069895 2.23746 0.976921 0.6361 91.4902
11 0.0561796 2.46271 0.98124 0.6307 100.622
12 0.0611673 2.62696 0.979021 0.6274 109.749
13 0.0434337 2.80836 0.985561 0.6262 118.893
14 0.0537561 2.52369 0.9824 0.6351 128.022
15 0.054097 2.75292 0.98178 0.6274 137.158
16 0.045905 2.88034 0.9847 0.6354 146.3
17 0.038558 2.94397 0.98716 0.6351 155.418
18 0.0468413 2.75888 0.98436 0.627 164.583
19 0.0346255 3.07014 0.98884 0.6249 173.721
20 0.0300259 3.2695 0.99022 0.6193 182.873
CIFAR-10$
畳み込みを1層から2層にすることで、テスト精度の最大値が、61.89%から66.67%に向上した。
約5%精度が向上した。
まあまあだ。
でも、向上の割合は半減しているので、畳み込み層を単純に増加させるだけでは限界が近いようだ。
何か別のことも試さないといけない。