DNNを実装してみた ( 1 )
さて今回は、Google Colaboratory(ちなみにGoogle Colaboratoryは無料で深層学習に必須なGPUやTPUを使用できるので超便利)を使って、前回記事で紹介した実践的なガイドに沿ったDNNを構築してみました。
また今回はデフォルト通り、MNISTデータに対してモデルを構築しました。
今回使用したコードはgithubに置いてあります。
基本的なDNNモデル
訓練するのは0から4までの数字とする (5から9は後でやる転移学習を使って訓練する)
- モデル
- 実行
- エポック数 : 1000
- バッチサイズ : 20
結果
0 Validation loss: 0.111523 Best loss: 0.111523 Accuracy: 97.85% 1 Validation loss: 0.259246 Best loss: 0.111523 Accuracy: 95.00% 2 Validation loss: 0.116553 Best loss: 0.111523 Accuracy: 97.46% 3 Validation loss: 0.439698 Best loss: 0.111523 Accuracy: 96.72% 4 Validation loss: 0.124247 Best loss: 0.111523 Accuracy: 96.48% 5 Validation loss: 0.556761 Best loss: 0.111523 Accuracy: 78.93% 6 Validation loss: 0.488352 Best loss: 0.111523 Accuracy: 87.88% 7 Validation loss: 0.327603 Best loss: 0.111523 Accuracy: 96.56% 8 Validation loss: 0.153663 Best loss: 0.111523 Accuracy: 97.97% 9 Validation loss: 0.481955 Best loss: 0.111523 Accuracy: 84.17% 10 Validation loss: 0.657136 Best loss: 0.111523 Accuracy: 77.95% 11 Validation loss: 0.583860 Best loss: 0.111523 Accuracy: 80.02% 12 Validation loss: 0.384622 Best loss: 0.111523 Accuracy: 91.67% 13 Validation loss: 200.980087 Best loss: 0.111523 Accuracy: 96.56% 14 Validation loss: 0.147616 Best loss: 0.111523 Accuracy: 97.62% 15 Validation loss: 0.134488 Best loss: 0.111523 Accuracy: 97.62% 16 Validation loss: 0.470304 Best loss: 0.111523 Accuracy: 84.64% 17 Validation loss: 0.204020 Best loss: 0.111523 Accuracy: 97.26% 18 Validation loss: 0.774719 Best loss: 0.111523 Accuracy: 95.35% 19 Validation loss: 0.299993 Best loss: 0.111523 Accuracy: 92.57% 20 Validation loss: 0.147901 Best loss: 0.111523 Accuracy: 96.56% Early stopping! Total training time: 49.6s INFO:tensorflow:Restoring parameters from ./my_mnist_model_0_to_4.ckpt Final test accuracy: 97.94%
以上より、最終的な正確度としては
97.94%
しかも1分もかからずにここまでの精度を出せるってことに感動(やっぱGPU最強)
以下を追加したバージョン
- 交差検証
- バッチ正規化
- ドロップアウト
ここからは途中経過も載せると長くなりすぎてしまうので、最終的な結果のみにします。
交差検証のみ
- 交差検証したパラメータ
- "n_neurons": [10, 30, 50, 70, 90, 100, 120, 140, 160],
- "batch_size": [10, 50, 100, 500],
- "learning_rate": [0.01, 0.02, 0.05, 0.1],
- "activation": [tf.nn.relu, tf.nn.elu, leaky_relu(alpha=0.01), leaky_relu(alpha=0.1)]
- 実行
- イテレーション数 : 50
- エポック数 : 1000
結果
交差検証結果
{'activation': <function tensorflow.python.ops.gen_nn_ops.relu(features, name=None)>, 'batch_size': 100, 'dropout_rate': 0.2, 'learning_rate': 0.01, 'n_neurons': 160}
正確度
0.9904650710254913
交差検証すると時間が結構かかるけど、その分正確度も相当上がっている。モデル自体は変わっていないのに、パラメータを変えただけでここまで精度が上がるって考えると交差検証はやっぱり重要。
以下、基本的に交差検証したパラメータと実行の回数は同じとする。
バッチ正規化 + 交差検証
- +α
- "batch_norm_momentum": [0.9, 0.95, 0.98, 0.99, 0.999]
結果
交差検証結果
{'activation': <function tensorflow.python.ops.gen_nn_ops.relu(features, name=None)>, 'batch_norm_momentum': 0.99, 'batch_size': 50, 'learning_rate': 0.01, 'n_neurons': 70}
正確度
0.9937731076084841
過学習を抑制しているにも関わらず、正確度が非常に高いなあ。 しかも次のドロップアウトと比べて実行時間がはやい。
ドロップアウト + 交差検証
- +α
- "dropout_rate": [0.2, 0.3, 0.4, 0.5, 0.6]
結果
交差検証結果
{'activation': <function tensorflow.python.ops.gen_nn_ops.relu(features, name=None)>, 'batch_size': 100, 'dropout_rate': 0.2, 'learning_rate': 0.01, 'n_neurons': 160}
正確度
0.9926055652850749
今回だとドロップアウトの方がバッチ正規化と比べて正確度は少しだけ落ちてる... (だからと言ってドロップアウトが劣っていると決めつけるのは早いけど)
次回
今回はMNISTデータの0から4までの数字を使ってDNNを構築したが、次回は今回構築したDNNを再利用して5から9までの数字についてのDNNを構築する転移学習を扱います。