粗大メモ置き場

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

Tensorflowを用いた手書き画像認識:MNISTを使ったテストコード(Windows,Anaconda,Python3.5)

記事の依存関係

以下の記事を元に環境などについては辿ってください。
ossyaritoori.hatenablog.com

Windows10でAnacondaに仮想環境を敷いた上で行っています。
Python3.5で行っておりCPUVersionです。

コードはJupyter notebookで記述しております。

MNISTについて

MNISTは0~9の手書き文字画像を7万枚集めたデータセットです。
これは標準のデータライブラリとして公開されているのでこれを用いて文字認識をしたいと思います。

以下公式?の説明の翻訳があります。
TensorFlow : ML 初心者向けの MNIST (コード解説) – TensorFlow
f:id:ossyaritoori:20170529020341p:plain

使用した学習モデルについて

いずれはディープラーニングとかに移行したいですが,今回は28×28の画像入力を単純に並列な入力として扱ったロジスティック回帰を行います。

  • 入力層 768ノード
  • 隠れ層 100ノード
  • 出力層 10ノード

としました。

バイアスを加えた線形和に対して,活性化関数としてシグモイド曲線を用いています。

また,最終的なOutputはsoftmax関数で定義するものとします。
誤差関数にはクロスエントロピーを使っています。
一般的な分類問題に用いられる形です。

参照したサイト

正直今回のコードは以下のスライドを流用しています。

www.slideshare.net

参考元との差異

上記のスライドの後半のコードを真似ていますが,Verが違うことに依る関数の違い等があります。

  • Python2系と3系の違いによるPrint関数の変化。
  • Softmax関数のCrossEntropyの記述方法が変わったことの反映

fix the error when using tensorflow 1.0 by xinlinli1990 · Pull Request #15 · udacity/CarND-LeNet-Lab · GitHub

コード

例のごとくGISTで貼っておきます。
行毎にコピペして1つの.pyファイルに置いてもいいですし,
自分のnotebookに貼って試してみるのもいいでしょう。

学習の実行結果

学習に伴い,誤差関数が減少しているのがわかります。
なお,確率的再急降下はランダムなので急に上がったりします。
今回はよくできた方ですね。

WARNING:tensorflow:From <ipython-input-32-fa591c7fbded>:3: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
Instructions for updating:
Use `tf.global_variables_initializer` instead.
step = 1000, loss=2.13
step = 2000, loss=1.45
step = 3000, loss=0.96
step = 4000, loss=1.22
step = 5000, loss=0.82
step = 6000, loss=0.89
step = 7000, loss=0.80
step = 8000, loss=0.67
step = 9000, loss=0.59
step = 10000, loss=0.38

警告について

なんか警告が出ていますがどうやらinitialize_all_variablesというのは今後使うなということみたいです。
TensorFlowのinitialize_all_variablesがDeprecatedになった件 - Qiita

代わりに以下のglobal~~を使えとのことです。 verが古いtensorflowでは実装されていないらしいので注意!

tf.Session().run(tf.global_variables_initializer())

結果

さて,訓練用データで訓練した結果をTestデータで検証した結果は以下のとおりです。

Accuracy (test data):   0.80%
True label: [7 2 1 0 4 1 4 9 5 9 0 6 9 0 1]
Est Label: [7 6 1 0 4 1 4 9 9 9 0 6 9 0 1]

やはり実用的にはちょっと低すぎますね。
層の構造を変えたりするとまた変わってきそうです。

Convolutional networkになるとどうなるんでしょうね。

エディタに関すること

jupyter notebook勧められて使いましたが結構良さげですね。
matlabでCtrl+Enterでセッションごとに実行するのとほぼ同じ感覚なので結構はかどります。

でもシャットダウンでCtrl+Cが上手くいかないのは仕様か何か?

関連書籍

Learning Tensorflow: A Guide to Building Deep Learning Systems

Learning Tensorflow: A Guide to Building Deep Learning Systems