Neural Network with TensorFlow-CNN@2017.12.1

畳み込みニューラルネットワーク(Convolutional Neural Network:CNN)アルゴリズムを手書き数字認識に当てはめてみる。
CNNは、顔認証で使用されているアルゴリズム。
——————————————-
## 1.ライブラリの読み込み ##

# TensorFlowライブラリ
import tensorflow as tf
# tflearnライブラリ
import tflearn

# 層の作成、学習に必要なライブラリの読み込み
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.normalization import local_response_normalization
from tflearn.layers.estimator import regression

# mnistデータセットを扱うためのライブラリ
import tflearn.datasets.mnist as mnist

import numpy as np
——————————————-
## 2.データの読み込みと前処理 ##
# MNISTデータを./data/mnistへダウンロードし、解凍して各変数へ格納
trainX, trainY, testX, testY = mnist.load_data(‘./data/mnist/’, one_hot=True)
——————————————-
# 1枚目の画像ピクセル値を表示
trainX[0]
Out>array([ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,

…..省略
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ], dtype=float32)
——————————————-
# 1枚目の画像ピクセル値のサイズを表示
print(len(trainX[0]))

# 1枚目の画像正解データを表示
print(trainY[0])

print(trainX[0])

Out>28
[ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[[[ 0. ]
[ 0. ]
[ 0. ]
[ 0. ]
[ 0. ]
[ 0. ]
[ 0. ]
[ 0. ]
[ 0. ]
……省略
——————————————-
# 画像ピクセルデータを1次元から2次元へ変換
trainX = trainX.reshape([-1, 28, 28, 1])
testX = testX.reshape([-1, 28, 28, 1])
——————————————-
# 1枚目の画像ピクセル値を表示
trainX[0]
Out>array([[[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ],
…….省略
——————————————-
# 1枚目の画像ピクセル値のサイズを表示
len(trainX[0])
Out>28
——————————————-
## 3.ニューラルネットワークの作成 ##

## 初期化
tf.reset_default_graph()

## 入力層の作成
net = input_data(shape=[None, 28, 28, 1])

## 中間層の作成
# 畳み込み層の作成
net = conv_2d(net, 32, 5, activation=’relu’)
# プーリング層の作成
net = max_pool_2d(net, 2)
# 畳み込み層の作成
net = conv_2d(net, 64, 5, activation=’relu’)
# プーリング層の作成
net = max_pool_2d(net, 2)
# 全結合層の作成
net = fully_connected(net, 128, activation=’relu’)
net = dropout(net, 0.5)

## 出力層の作成
net = tflearn.fully_connected(net, 10, activation=’softmax’)
net = tflearn.regression(net, optimizer=’sgd’, learning_rate=0.5, loss=’categorical_crossentropy’)
——————————————-
## 4.モデルの作成(学習) ##
# 学習の実行
model = tflearn.DNN(net)
model.fit(trainX, trainY, n_epoch=20, batch_size=100, validation_set=0.1, show_metric=True)

Out>Training Step: 9899 | total loss: 0.00619 | time: 212.104s
| SGD | epoch: 020 | loss: 0.00619 – acc: 0.9988 — iter: 49400/49500
Training Step: 9900 | total loss: 0.00559 | time: 220.884s
| SGD | epoch: 020 | loss: 0.00559 – acc: 0.9989 | val_loss: 0.02821 – val_acc: 0.9940 — iter: 49500/49500

——————————————-
## 5.モデルの適用(予測) ##
pred = np.array(model.predict(testX)).argmax(axis=1)
print(pred)

label = testY.argmax(axis=1)
print(label)

accuracy = np.mean(pred == label, axis=0)
print(accuracy)

Out>[7 2 1 …, 4 5 6]
[7 2 1 …, 4 5 6]
0.9946
——————————————-
モデルでは99.46%の正解率!
いよいよ自作の手書き数字(一部手書きでないが…)をアプライする。
——————————————-
#未判断自作画像の読み込み
import numpy
# scipy.special for the sigmoid function expit()
import scipy.special
# library for plotting arrays
import matplotlib.pyplot
# ensure the plots are inside this notebook, not an external window
%matplotlib inline
# helper to load data from PNG image files
import scipy.misc
# glob helps select multiple files using patterns
import glob

# our own image test data set
our_own_dataset = []
arrX = np.empty((0,784), float)
arrY = np.empty((0), int)

# load the png image data as test data set
for image_file_name in glob.glob(‘my_own_images/2828_my_own_R_?.png’):

# use the filename to set the correct label
label = int(image_file_name[-5:-4])

# load image data from png files into an array
print (“loading … “, image_file_name)
img_array = scipy.misc.imread(image_file_name, flatten=True)

# reshape from 28×28 to list of 784 values, invert values
img_data = 255.0 – img_array.reshape(784)

# then scale data to range from 0.01 to 1.0
img_data = (img_data / 255.0 * 0.99) + 0.01
print(numpy.min(img_data))
print(numpy.max(img_data))

# append label and image data to test data set

arrX = np.append(arrX, np.array([img_data]), axis=0)
arrY = np.append(arrY, np.array([label]), axis=0)

record = numpy.append(label,img_data)
our_own_dataset.append(record)

pass
——————————————-
#このreshapeを忘れないように、行列を変換
arrX = arrX.reshape([-1, 28, 28, 1])
——————————————-
print(arrX[0])
Out>[[[ 0.03329412]
[ 0.01388235]
[ 0.01 ]
[ 0.01 ]
[ 0.01 ]
[ 0.01 ]
[ 0.01 ]
[ 0.01776471]
[ 0.09929412]
[ 0.28952941]
[ 0.53800005]
[ 0.60788238]
[ 0.55352944]
….省略
——————————————-

——————————————-
## 5.モデルの適用(予測) ##
pred = np.array(model.predict(arrX)).argmax(axis=1)
print(pred)
print(arrY)

accuracy = np.mean(pred == arrY, axis=0)
print(accuracy)

Out>
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
1.0
——————————————-
100%認識成功!
——————————————-