meideru blog

家電メーカーで働いているmeideruのブログです。主に技術系・ガジェット系の話を書いています。

TensorFlowでMNISTをやってみた

 

前回の記事でChainerからTensorFlowに乗り換えたという話をしました。

ChainerからTensorFlowに乗り換える話
最近は機械学習(とりわけディープラーニング)を勉強しています。ディープラーニングでモデル(ニューラルネットワーク)を作るときは効率を考慮してフレームワークを使います。私はChainerというフレームワークを入門してみたのですが、色々と嫌になってTensorFlowに移ることにしました( ;∀;)今日はそんな話を記事に書きます。なぜフレームワークを使うのかディープラーニングに限らず、フレームワークは多くの場面で使われますよね。ソフトウェア開発やウェブ開発などでも使うことでしょう。理由は効率を重視してだと思います。煩...

 

今回は、TensorFlowを用いてMNISTをやってみました。

MNISTはプログラミングの世界で言うところの「Hello World !」のようなものでありますので、探せばサンプルコードはいくらでも落ちてると思います。

しかし、今回はTensorFlowの習得が目的なので、1から自分で書いてみました。

今日はそんな話を記事に書きます♪( ´θ`)ノ

目次

MNISTについて

MNISTとは手書きの数字文字のデータのことです。

@MNIST
MNISTのサンプル

上の画像がMNISTです。

手書きなので人それぞれの個性が出ているのがわかると思います。

これをディープラーニングを用いて認識させると言うのが今回のやることです。

実行環境

MNIST自体はディープラーニングの中では軽い処理なので、MacBook Air 13インチでやりました。(CPUはCore i5?)

@MacBook Air 13インチ
MacBook Air 13インチ

もちろんGPU支援はなしです。

 

pythonはAnacondaというディストリビューションを使用します。

@Anaconda
Anaconda

Anacondaは予め必要なパッケージがインストールされていて非常に便利です。また、condaコマンドで環境を簡単に構築できるといったメリットもあります。

作成したモデル

入力層(入力数:784)

隠れ層(ノード数:50, 活性化関数:シグモイド関数, 出力数:50)

隠れ層(ノード数:50, 活性化関数:ソフトマックス関数, 出力数:10)

出力層(出力数:10)

という感じになっています。

人によって呼び方は違うと思いますが、「2層のニューラルネットワーク」で実行しています。

ソースコード

ソースコードはGitHubにプッシュしておきました。

https://github.com/meideru/mnist

雑ではありますが、READMEに使い方なども書いておきました。

実際にやってみた

結果

精度94.9%で認識することができました。

勉強不足な私が1から考えたモデルにしては中々のできだと思っていますw

認識できなかった文字は何なのか

精度は10,000個の数字文字で検証しました。この内510個を認識することができませんでした。

そこで、どういった数字文字を認識することができなかったのかを明示したいと思います。

具体的には以下のようなものを認識することができませんでした。

 

@4と判定(正解は8)
MNIST(8)

@4と判定(正解は9)
MNIST(9)

@5と判定(正解は3)
MNIST(3)

@5と判定(正解は9)
MNIST(9)

@6と判定(正解は4)
MNIST(4)

書く人の個性が強く出た数字文字が多いような感じがしますよね。

これならば人間も誤認識するかもしれません。

これはほんの一部ですが、コンピュータが正しく判定できなかった数字文字の中には、もっと個性が強く出ているものも多いと思います。

そういった意味では、今回作成したモデル(ニューラルネットワーク)は、ある程度、人間に近い判断力を持っている、と言っても良いのかもしれません。

まとめ

とりあえず、MNSITを通してTensorFlowの基本的な使い方は理解できたと思います。

次は、もう少し高度な画像認識に挑戦してみようと思います。具体的にはリンゴのようなものを識別できたらなと思っています。

最終的にはR-CNNをベースとした手法で物体検出までできればいいなと思っています(^ ^)

 

以上です!

ノシ

 - 技術系