MNIST とは手書きの数字のモノクロ画像データでAI画像認識の練習用によく使われています。
MNIST の Web ページを見ると、学習用で 60,000, テスト用 10,000 の手書き文字データが利用できるそうです。
画像1枚は28×28ピクセルです。
http://yann.lecun.com/exdb/mnist/

TFLearn には MNIST 関連のライブラリがあるので、これを利用してPythonプログラムを作成し、画像を幾つか表示してみました。

――― MNISTのダウンロードと画像表示のプログラム
## TensorFlow TFLearn をインポート
import tensorflow as tf
import tflearn as tfl
## グラフ描画等に使われるライブラリ
from matplotlib import cm
from matplotlib import pyplot as plt

## 最初の5枚を表示
## 画像はピクセルデータの配列としてダウンロード
## trainX 学習用データ、trainY 正解データ
## testX テスト用データ、testY 正解データ
trainX, trainY, testX, testY = tfl.datasets.mnist.load_data(‘./data/mnist/’, one_hot=True)
print(‘学習用データ数’)
print(len(trainX))
print(‘テスト用データ数’)
print(len(testX))

## 学習用データ、正解データの先頭5個を表示してみる
i=0
while i < 5:
plt.imshow(trainX[i].reshape(28, 28), cmap=cm.gray_r,     interpolation=’nearest’)
plt.show()
print(trainY[i])
i =  i+ 1

――― 結果
学習用データ数
55000
テスト用データ数
10000

MNIST_TRAIN

・・・・・・・・(以下省略)

正解データは、1 の立っている配列インデックス(0~9)となっています。
(一番目の「ヲ」のような文字は「7」だそうです。7には見えないかもしれませんが、このぐらいが解読可能の境界でしょうか?)
まず、もっとの簡単な練習プログラムとして、
TFLearn の fully_connected() を使って中間層が全結合型のニューラルネットワークを作って学習させてみました。

――― 全結合型のニューラルネットワーク
## TensorFlow TFLearn をインポート
import tensorflow as tf
import tflearn as tfl
## 実行時間を見たいので、前述のプログラムに時刻表示用のインポートを追加
import datetime as dt
## 結果の評価 数値計算用
import numpy as np

## 画像はピクセルデータの配列としてダウンロード
trainX, trainY, testX, testY = tfl.datasets.mnist.load_data(‘./data/mnist/’, one_hot=True)

## 中間層全結合型ニューラルネットワーク
## ノード 256 の DNN、 活性化関数 ReLU
tf.reset_default_graph()

## 入力層
net = tfl.input_data(shape=[None, 784])

## 中間層
net = tfl.fully_connected(net, 256, activation=’relu’)
net = tfl.dropout(net, 0.5)

## 出力層
net = tfl.fully_connected(net, 10, activation=’softmax’)
net = tfl.regression(net, optimizer=’sgd’, learning_rate=0.5, loss=’categorical_crossentropy’)

## 学習
time1 = dt.datetime.now();
model = tfl.DNN(net)
model.fit(trainX, trainY, n_epoch=20, batch_size=100, validation_set=0.1, show_metric=True)
time2 = dt.datetime.now();

## テスト(予測)
time3 = dt.datetime.now();
result = model.predict(testX)
time4 = dt.datetime.now();

## 実行時間を表示
print(‘learning start:’ + str(time1))
print(‘learning end:’ + str(time2))
print(‘predict start:’ + str(time3))
print(‘predict end:’ + str(time4))

## 結果を表示
pred = np.array(result).argmax(axis=1)
print(pred)
label=testY.argmax(axis=1)
print(label)

## 予測の精度
accuracy = np.mean(pred == label, axis=0)
print(accuracy)

――― 結果
learning start:2018-02-03 20:33:12.646430
learning end:2018-02-03 20:37:24.713400
predict start:2018-02-03 20:37:24.713400
predict end:2018-02-03 20:37:25.031950
[7 2 1 … 4 5 6]
[7 2 1 … 4 5 6]
0.9827

テストは、98% 以上の正解です。
学習の実行時間は、約4分、予測の実行時間は1秒以下でした。

(ハードスペック CPU Intel  Core2Duo 2.8GHz メモリ 6GByte, GPUなし)

2回実行してみましたが、結果は毎回変化します。
(初期値がランダムなので同じとはなりません。)

learning start:2018-02-03 20:39:56.831873
learning end:2018-02-03 20:44:12.236173
predict start:2018-02-03 20:44:12.236173
predict end:2018-02-03 20:44:12.530747
[7 2 1 … 4 5 6]
[7 2 1 … 4 5 6]
0.9778

 

ノードを 512にして実行してみました。

――― 結果(ノード512)
learning start:2018-02-03 20:23:34.402772
learning end:2018-02-03 20:29:41.604538
predict start:2018-02-03 20:29:41.604538
predict end:2018-02-03 20:29:42.121952
[7 2 1 … 4 5 6]
[7 2 1 … 4 5 6]
0.9828

学習の実行時間は、約6分、予測の実行時間は1秒以下。
精度は少しだけ上がったかもしれません(微妙ですが)。

ノードを 4096にして実行してみました。
――― 結果(ノード4096)
learning start:2018-02-03 19:44:00.629881
learning end:2018-02-03 20:18:30.696156
predict start:2018-02-03 20:18:30.696156
predict end:2018-02-03 20:18:33.324433
[7 2 1 … 4 5 6]
[7 2 1 … 4 5 6]
0.9835

学習の実行時間は、約35分、予測の実行時間は3秒程度。
時間がかかった割には効果はありませんでした。

とりあえす、今回はここまで。

(S.Onda 2018/2/5)
(S.Onda 2018/2/17 一部修正)