Deep Learning 脱初心者めざして

主にDeepLearningや画像処理について扱います

DNNを実装してみた ( 1 )

さて今回は、Google Colaboratory(ちなみにGoogle Colaboratoryは無料で深層学習に必須なGPUやTPUを使用できるので超便利)を使って、前回記事で紹介した実践的なガイドに沿ったDNNを構築してみました。

また今回はデフォルト通り、MNISTデータに対してモデルを構築しました。

mamomamoru.hatenablog.com

今回使用したコードはgithubに置いてあります。

github.com

基本的な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)]
  • 実行
結果

交差検証結果

{'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を構築する転移学習を扱います。