【Python/TensorFlow】MNISTで手書き数字認識

Pythonの深層学習モジュール「TensorFlow」と「MNIST」を用いて、手書き数字認識をする方法についてソースコード付きでまとめました。

mnistの手書き文字認識

mnistのデータセットは、「6万枚の手書き数字の学習用画像」と「1万枚のテスト画像」が格納されています。
これらの画像は全て28×28[px]のグレースケール画像となっています。
mnistのデータセットは、機械学習の性能評価によく用いられます。
詳細→https://keras.io/ja/datasets/#mnist

TensorFlowでは、mnistのデータセットを使って簡単に手書き数字認識ができます。

サンプルコード(Python + TensorFlow)

サンプルプログラムのソースコードです。(AND演算)

# -*- coding:utf-8 -*-
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


# 繰り返し学習回数(1000回)
epochs = 1000

# MNISTのデータセットを取得
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# モデルの作成
x = tf.placeholder(tf.float32, [None, 784]) # 入力信号(画像)
W = tf.Variable(tf.zeros([784,10])) # 重みw
b = tf.Variable(tf.zeros([10]))# バイアスb
y = tf.nn.softmax(tf.matmul(x, W) + b)# 出力信号y(=活性化関数:ソフトマックス関数)

# 教師信号(正解のラベルデータ)
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)

# 繰り返し学習
for i in range(epochs):
    # 訓練用データのうちサンプルを100個ランダムに抽出
    batch_xs, batch_ys = mnist.train.next_batch(100)

    # 確率的勾配降下法で重みを更新
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    # 予測値と正解値の比較し、正解率を求めて表示
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    accuracy_rate = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
    print(str(i+1) + "回目の正解率:" + str(accuracy_rate))

■実行結果

︙
997回目の正解率:0.9145
998回目の正解率:0.918
999回目の正解率:0.9195
1000回目の正解率:0.9206
関連記事
1 【Python/TensorFlow入門】ディープラーニングの使い方
2 【機械学習入門】アルゴリズム&プログラミング
3 Python入門 基本文法

コメント