粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

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を用いて実行します。

コード例1

こちらのブログのコードを転用しています。
書き方が公式とちょっと違う気がしているので戸惑うかもしれません。

qiita.com


結果

以下,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の表示を見せます。
f:id:ossyaritoori:20170531200353p:plain

これをずっとやった結果:Test accuracy: 0.9837とやはり98%近い性能を出せました。


今後やってみたいこと

これは結局テストデータを使っているだけなので実際にこの学習器をOpenCV等と連携して
実画像の認識をやってみたいなぁと思います。
思っているだけかもしれませんが。