※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

CIFAR-10のカラー画像学習にプーリングを入れてみた


2017年 05月 25日

前回は、プーリングの説明をした。
今回からは、プーリングの実装について書く。
といっても、僅かな変更を加えるだけである。

とりあえす、プーリングのサイズが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$
accuracy-CNN4.png
テスト精度がほぼ0.7まで上昇した。
前回は67%には届かなかったので、また約3%性能アップしたようだ。

さて、次は、どうしよう。
プーリング層を増やすか、それともプーリングのサイズを変えて効果の違いを探るか、やるべきことは色々ありそうだ。