本ページでは、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 データを読み込みます。TensorFlow には、クイックに検証する目的で、MNIST データをダウンロードし、読み込む機能があらかじめ組み込まれています。
1 2 3 |
# MNIST データセットを読み込む from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) |
モデルの作成
今回は、Softmax 回帰による予測モデルを作成します。Softmax 回帰は、多変量のロジスティック回帰を利用した多値分類のアルゴリズムで、予測モデルは以下式で表せます。
Y が目的変数 (0-9の数字)、X が入力変数 (256 階調のグレースケールで示される、各ピクセルの濃淡を 0.0-1.0 で表したもの)、W が重み、b がバイアスの行列を意味し、より詳細な式は以下のように表せます。
以下例では、入力データと出力データの格納領域として、プレースホルダ (placeholder) を作成します。また、重み行列とバイアス行列の格納領域として、Variable を作成します。Variable はプレースホルダと異なり、書き換えができる特徴があります。
今回は、最適な重みとバイアスを推定するためのコスト関数として、交差エントロピー (cross entropy) と呼ばれる指標を用います。この交差エントロピーが最も小さくなるように、TensorFlow に GradientDescentOptimizer
として実装されている、勾配降下法 (Gradient descent) を用いて学習を進めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# TensorFlow を読み込み import tensorflow as tf # 入力データ格納用の 784 px 分のプレースホルダを作成 x = tf.placeholder(tf.float32, [None, 784]) # 重み (784 x 10 の行列) の Variable を定義 W = tf.Variable(tf.zeros([784, 10])) # バイアス (長さ 10 の行列) の Variable を定義 b = tf.Variable(tf.zeros([10])) # ソフトマックス回帰による予測式を定義 y = tf.nn.softmax(tf.matmul(x, W) + b) # 出力データ (予測値) 格納用のプレースホルダ y_ = tf.placeholder(tf.float32, [None, 10]) # 交差エントロピーを最小化するよう、学習を行う式を以下のように定義 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) # 初期化 init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) # 学習を 1,000 回繰り返す for i in range(1000): # 訓練用データから 100 件取得 batch_xs, batch_ys = mnist.train.next_batch(100) # train_step を実行 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) |
モデルの評価 (モデルを用いた予測)
作成したモデルとテスト用データを用いて、どのくらい正確にテストデータの予測ができるかを評価します。以下イメージは、訓練用データ、作成したモデル、テスト用データがどのように使われるかを表したものです。
1 2 3 4 5 6 7 8 |
# 実際の値と予測された値が同じであるか確認 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) # 平均値を求め、予測精度を求める accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # x にテストデータ、y_ に実際の値をあてはめ、上記で作成した式を実行 print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) |
実行した結果、識別力が 0.921 (約 92 %) と出力できました。
本手順の Jupyter Notebook はこちらからダウンロードできます。Tensorflow-Tutorial.ipynb
参考: TensorFlow — MNIST For ML Beginners