Tensorflow,Kerasを用いた手書き画像認識Ⅱ:多層ニューラルネットを用いたテストコード
記事の前提
前回は隠れ層を入れたパーセプトロンを用いて手書き画像の認識を行いました。
ossyaritoori.hatenablog.com
Kerasとは
Python上で動作する深層学習用のライブラリのことです。
TensorflowやTheanoと言ったライブラリを前提にしていて,それらを用いてより高い抽象度で計算を書けるようです。
まぁつまり,「簡単」ってこと!!!(せやろか)
深層学習ライブラリ Keras - 人工知能に関する断創録
Python製深層学習ライブラリ「Keras」の紹介 (with TensorFlow) - amacbee's blog
Kerasの環境構築1
実は,Tensorflow1.0以降を入れている場合はKerasはモジュール?の一部として入っているようです。
今のところこっちで特に問題はなさそうな感じがします。
Kerasの環境構築2
先程とは別の枠組みでKerasのライブラリをインポートして記述することも可能です。
import文が簡単に書ける以外でどう違うのかは今のところわかっていません…
それにはまずKerasパッケージを入れる必要があるので,パッケージインストールの例に習って,
ossyaritoori.hatenablog.com
1.パッケージを探すために以下のコマンドを叩きます。
anaconda search -t conda keras
2.出てきた候補の中でwin64に対応していて,なるべく新しそうなものをチョイスします。2017年5月末ではconda-forgeが良さそうです。
そして以下のコマンドを叩きます。
anaconda show conda-forge/keras
3.最後に2で示されたURLをコピって貼っておしまいです。
conda install --channel https://conda.anaconda.org/conda-forge keras
Kerasを用いた手書き文字認識 テストコード1
Tensorflowにもとから入っているKerasを用いて実行します。
結果
以下,10000回学習した結果です。
テストの結果認識率は約97%で前回の場合よりも大分改善しました。
Training... step, accurary = 0: 0.025 step, accurary = 1000: 0.910 step, accurary = 2000: 0.935 step, accurary = 3000: 0.955 step, accurary = 4000: 0.940 step, accurary = 5000: 0.970 step, accurary = 6000: 0.985 step, accurary = 7000: 0.965 step, accurary = 8000: 0.970 step, accurary = 9000: 0.975 step, accurary = 10000: 0.980 Test accuracy: 0.9727
考察?
前回のパーセプトロンからの変化として,
多分ノード数と活性化関数が変更になったこと,活性化関数が各層にかかったことがあります。
あとドロップアウトというノードの一部をランダムに無視する手法も用いています,
関連して,学習にかかる時間も精度も大幅に上昇しました。
ドロップアウトの影響
例えばドロップドロップをなくすと次のような結果になります。
あれ?そんな変わらない?ただ,それまでの経過を見るにそれなりには差があるようです。
Training... step, accurary = 0: 0.155 step, accurary = 1000: 0.935 step, accurary = 2000: 0.915 step, accurary = 3000: 0.950 step, accurary = 4000: 0.955 step, accurary = 5000: 0.945 step, accurary = 6000: 0.960 step, accurary = 7000: 0.955 step, accurary = 8000: 0.970 step, accurary = 9000: 0.955 step, accurary = 10000: 0.965 Test accuracy: 0.9726
Kerasを用いた手書き文字認識 テストコード2
Kerasの使用法に関しては公式のDocumentがわかりやすいのでこれを見てください。
Sequentialモデルのガイド - Keras Documentation
tensorflowに組み込まれているKerasライブラリも基本的にこれらと同じ書き方が出来るようですね。
Kerasでのモデルの記述の仕方
非常に直感的な書き方になっていてmodel.addで層を加えていきます。
最初のSequencial()は言わばInitializationで
その後.addで層を入力側から見て加えています。Dence(A,input_shape=B)というのは入力の自由度がBで出力自由度がAということです。
従って入力層と隠れ層は512のノードを格納した配列ということになります。(よね?)
その後Activationで活性化関数を指定しています。前回はシグモイドでしたが,近年の深層学習ではReLu関数が主流のようです(文献1)。
# build model model = Sequential() model.add(Dense(512, input_shape=(784, ))) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(10)) model.add(Activation('softmax')) model.summary()
テストコード
先程のブログを参照するとこうなります。
実行の様子
正直結果はそんなに変わらないので,こちらはSpyderの表示を見せます。
これをずっとやった結果:Test accuracy: 0.9837とやはり98%近い性能を出せました。
今後やってみたいこと
これは結局テストデータを使っているだけなので実際にこの学習器をOpenCV等と連携して
実画像の認識をやってみたいなぁと思います。
思っているだけかもしれませんが。