TensorFlow で手書き文字認識 (Softmax 法)

Last update: 2016-07-26

[期間限定記事] オンライン学習サイト Udemy で Python とデータサイエンスを学ぼう *割引中1,200円*

本ページでは、Google Brain Team によって開発されたオープンソースの機械学習エンジンである、TensorFlow (テンソルフロー) を利用して手書き文字認識を行います。

もし、まだ TensorFlow をインストールしていない場合は、「TensorFlow をインストール」のページの手順にてインストール作業を行いましょう。

今回使用するデータ

本手順では、MNIST データ (MNIST handwritten digit database) と呼ばれる、0-9 の手書きの数字の画像データ (縦 82 x 横 82 px = 計 784 px) を利用します。このデータセットは 3 つに分かれており、訓練用 (Train) データ 55,000 件、テスト用 (Test) データ 10,000 件、検証用 (Validation) データ 5,000 件の 計 70,000 件で構成されています。

各数字のサンプル
mnist-img

データセットの構成イメージ
mnist


データの読み込み

以下コードで MNIST データを読み込みます。TensorFlow には、クイックに検証する目的で、MNIST データをダウンロードし、読み込む機能があらかじめ組み込まれています。

Screenshot from 2016-07-05 23-11-04


モデルの作成

今回は、Softmax 回帰による予測モデルを作成します。Softmax 回帰は、多変量のロジスティック回帰を利用した多値分類のアルゴリズムで、予測モデルは以下式で表せます。

mnist-fig2

Y が目的変数 (0-9の数字)、X が入力変数 (256 階調のグレースケールで示される、各ピクセルの濃淡を 0.0-1.0 で表したもの)、W が重み、b がバイアスの行列を意味し、より詳細な式は以下のように表せます。

mnist-fig1

以下例では、入力データと出力データの格納領域として、プレースホルダ (placeholder) を作成します。また、重み行列とバイアス行列の格納領域として、Variable を作成します。Variable はプレースホルダと異なり、書き換えができる特徴があります。

今回は、最適な重みとバイアスを推定するためのコスト関数として、交差エントロピー (cross entropy) と呼ばれる指標を用います。この交差エントロピーが最も小さくなるように、TensorFlow に GradientDescentOptimizer として実装されている、勾配降下法 (Gradient descent) を用いて学習を進めます。

Screenshot from 2016-07-05 23-12-55

Screenshot from 2016-07-05 23-14-56


モデルの評価 (モデルを用いた予測)

作成したモデルとテスト用データを用いて、どのくらい正確にテストデータの予測ができるかを評価します。以下イメージは、訓練用データ、作成したモデル、テスト用データがどのように使われるかを表したものです。

mnist-image

実行した結果、識別力が 0.921 (約 92 %) と出力できました。

Screenshot from 2016-07-05 23-15-28

本手順の Jupyter Notebook はこちらからダウンロードできます。Tensorflow-Tutorial.ipynb

参考: TensorFlow — MNIST For ML Beginners

See also