勉強用に作っている https://pycall-mnist.herokuapp.com をリファクタリングした。

O'Reilly Japan - ゼロから作るDeep Learning の第4章をベースにした素朴な実装だったが、第5章を参考にレイヤークラスで処理するようにした。

predictに(勝手に)用意していたskip_activate_outputフラグは不要になった。
必要な時にlastLayerを呼び出す形に。
※ 推論の時は生データ(スコア)でいいのでlastLayerは不要。

まずはSigmoidのまま実装して、rspecが通ることを確認。
その後、ReLUに切り替えた。

Sigmoid

train acc, test acc | 0.9468333333333333%, 0.9452%

ReLU

train acc, test acc | 0.9791166666666666%, 0.9713%

ReLUにしただけで認識精度が3%も上がった…!

PyCallのバージョンも上がっていたので合わせてアップデート。特に問題なし。

ソース

Layers by tnantoka · Pull Request #1 · tnantoka/pycall-mnist

参考

Python DeepLearningに再挑戦 15 誤差逆伝播法 Affine/Softmaxレイヤの実装 - Djangoroidの奮闘記