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

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%で終わっている。

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