MNISTで学習データの個数をケチってみた


2017年 04月 10日

学習データ数を減らして実験をしてみよう。
オリジナルは、MNISTの学習用データ数の60000であるが、10000, 2000, 500と減らしながら実験してみた。
もちろん、時間がもったいないので GPU を利用した。

学習データ 60000個
Chainer$ python train_mnist0.py -g 0
GPU: 0
# number: 60000
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.193926    0.0882014             0.941183       0.9735                    2.43387
2           0.075335    0.0752461             0.976834       0.976                     4.83063
3           0.0480114   0.074878              0.984965       0.978                     7.23542
・・・・・・・・・・・・・・・      中  略      ・・・・・・・・・・・・・・・
18          0.00998753  0.104438              0.996899       0.9828                    43.1969
19          0.00818152  0.0978973             0.997833       0.9821                    45.6029
20          0.00540837  0.0948488             0.998149       0.9817                    48.0003
Chainer$
学習データ 10000個
Chainer$ python train_mnist0.py -g 0 -n 10000
GPU: 0
# number: 10000
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.4188      0.217062              0.8749         0.9334                    0.925599
2           0.153328    0.196418              0.9534         0.9377                    1.74652
3           0.0852114   0.139428              0.9756         0.9561                    2.58325
・・・・・・・・・・・・・・・      中  略      ・・・・・・・・・・・・・・・
18          7.43423e-05  0.158279              1              0.9674                    14.9663
19          6.48571e-05  0.159226              1              0.9674                    15.7797
20          5.74103e-05  0.160547              1              0.9673                    16.6219
Chainer$
学習データ 2000個
Chainer$ python train_mnist0.py -g 0 -n 2000
GPU: 0
# number: 2000
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.949915    0.49678               0.7335         0.8402                    0.648741
2           0.315252    0.36667               0.9065         0.8894                    1.21073
3           0.16682     0.316182              0.957          0.9049                    1.80692
・・・・・・・・・・・・・・・      中  略      ・・・・・・・・・・・・・・・
18          0.00063135  0.327181              1              0.9257                    10.3965
19          0.000569121  0.328971              1              0.925                     10.9622
20          0.000512893  0.331511              1              0.9251                    11.5304
Chainer$
学習データ 500個
Chainer$ python train_mnist0.py -g 0 -n 500
GPU: 0
# number: 500
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           1.814       1.16017               0.456          0.7062                    0.596051
2           0.66647     0.718226              0.85           0.7652                    1.12284
3           0.345737    0.635446              0.888          0.7999                    1.65856
・・・・・・・・・・・・・・・      中  略      ・・・・・・・・・・・・・・・
18          0.00110594  0.596009              1              0.863                     9.70698
19          0.00101897  0.600444              1              0.8626                    10.2394
20          0.000941102  0.6048                1              0.8626                    10.7713
Chainer$
学習データが60000個から500個に減っても、速度は4倍程度しか高速になっていない。
やはり、GPUを使う場合、色々オーバーヘッドが多いということであろうか。

いや、それよりも、テスト時の正解率の減少の方が問題だ。
98%を超えていた正解率が、86%で終わっている。

そうだ、正解率など、学習経過を延々と数字で見るのではなく、パッと一瞬で分かる方法が欲しいものだ。
どうすれば良いだろうか?