デフォルのままだと、中間層が2層で、それぞれ1000ユニットで、
784 ==> 1000 ==> 1000 ==> 10
として動かしていた。
中間層の2層のノード数を自由に変更できるようになったので、まず次のようにしてみた。
784 ==> 300 ==> 30 ==> 10
Chainer$ python train_mnist1.py -g 0 -u 300 30
GPU: 0
# number: 60000
# units: [300, 30]
# Minibatch-size: 100
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.307806 0.150247 0.913467 0.954 2.44043
2 0.123374 0.112284 0.963534 0.9662 4.77677
3 0.0812434 0.0797795 0.975833 0.9758 7.09853
・・・・・・・・・・・・・・・ 中 略 ・・・・・・・・・・・・・・・
18 0.00678134 0.0989654 0.997766 0.9799 42.7799
19 0.00394047 0.107429 0.998866 0.9782 45.2334
20 0.00806017 0.0969633 0.997466 0.9803 47.6298
Chainer$
かなり中間層を小さくしたのだが、テスト精度は98%あり、精度は落ちていない。
つまり、中間層を小さくしても影響は少ないようだ。
ということで、どんどん減らしてみよう。
中間層の第2層を出力層と同じ10まで下げてみた。
分類数と同じだが、どうなるだろうか?
784 ==> 50 ==> 10 ==> 10
Chainer$ python train_mnist1.py -g 0 -u 50 10
GPU: 0
# number: 60000
# units: [50, 10]
# Minibatch-size: 100
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.583669 0.312933 0.828284 0.9087 2.45214
2 0.26503 0.23423 0.925767 0.931 4.88362
3 0.202712 0.191492 0.942717 0.9448 7.3304
・・・・・・・・・・・・・・・ 中 略 ・・・・・・・・・・・・・・・
18 0.0472231 0.132507 0.985798 0.9636 42.9347
19 0.0456997 0.120474 0.986715 0.9653 45.3106
20 0.0433583 0.123629 0.986148 0.9672 47.6485
Chainer$
かなり中間層を絞ったのだが、まだ96%の正解率である。
ということで、思いっきり絞ってみた。
784 ==> 40 ==> 2 ==> 10
Chainer$ python train_mnist1.py -g 0 -u 40 2
GPU: 0
# number: 60000
# units: [40, 2]
# Minibatch-size: 100
# epoch: 20
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 1.66372 1.36298 0.392867 0.5006 2.45188
2 1.20082 1.08511 0.562367 0.6294 4.81112
3 0.997415 0.951765 0.65775 0.6989 7.13735
18 0.3529 0.502587 0.915784 0.8996 42.5103
19 0.341643 0.48146 0.918735 0.9035 44.8852
20 0.329597 0.491561 0.920851 0.9042 47.2294
Chainer$
という訳で、中間層のユニット数をどんどん減らし、第2層のユニット数を2まで減らしても正解率90%を維持しているのは脅威だ。
といっても、手書き数字の読み取りでの場合なのだ。
少々手書き数字には飽きてきたので、別のデータセットなども考えてみることにする。