mnistデータセットをKerasで試してモデルを可視化する

本を参考にしてKerasを用いてmnistのデータセットを使って手書き文字の分析をしてみた。


【参考】詳解ディープラーニング 4章 p.143
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

 

今回は以下のサイト参考にしてモデルの可視化をしてみました。
[Keras] モデルの可視化をしよう!! – MATHGRAM

書いてある通りに、graphviz,pydot_ngというのをインストールします。
$ brew install graphviz
$ pip install pydot_ng

あとはpythonファイルに読み込むだけですがここで注意することがあります。
上のサイトは2016/5/4に書かれた記事のようですがKerasのmodule名が2017/2/28に変わったみたいです。
ですので読み込むときは以下のように書きます。
from keras.utils.vis_utils import plot_model

で、使うときは
plot_model(model, to_file='model.png', show_shapes=True)
のように書けば、実行した場所にmodel.pngという名前のファイルが保存されます。

今回は上のようなモデルを使いました。
隠れ層が1つだけの割とシンプルなモデルですね。

loss:0.27117070275545119
acc :0.91649999999999998

これだけでもそこそこの精度が出ています。
ちなみに活性化関数はsigmoidとsoftmaxを使っています。

今回はscikit-learnのメソッドを使ってmnistのデータを落として使っているのですが、
それの使い方の一部を簡単にメモします。

【参考】sklearn.model_selection.train_test_split — scikit-learn 0.18.1 documentation

a,b,c,d = train_test_split(X,y,test_size=0.33)を実行することで、
a,bにはXのデータを、
c,dにはyのデータを、
test_sizeの割合(この場合はa:b=c:d=2:1)になるように分けています。

実用的には、
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.8)
と書くことで簡単に訓練データと教師データをランダムに訓練用と評価用に分けることができます。

また、本を読み進めていくと、sigmoid関数は微分した時の最大値でも0.25で、比較的0に近い値が出力されるので隠れ層を増やすと勾配消失問題が起こるのでtanhにすると微分した時の最大値が1になるのでsigmoidよりも勾配が消失しにくいとありました。

じゃあさ!10*tanhにしたらもっと消失しにくいんじゃね?!と思って実行してみました。

 

結果
[14.441813323974609, 0.104]
全然あかん・・。

ちなみに素のtanhを使った時
結果
[0.28583626043796539, 0.91749999999999998]

次に2*tanhにしてみた。
結果
[0.2997873431444168, 0.91049999999999998]

若干下がった。
ダメですね。tanhはそのままのtanhがいいみたい。どうしてでしょう。

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

コメントを残す