#MNISTとは
まず、はじめに今回しようするMNISTについて簡単に説明する
MNISTとは手書き数字(0~9)の画像データセットの名称である。
今回使用するMNISTデータセットの中身は
・train :55000枚
・validationm :5000枚
・test : 10000枚
の計70000枚で構成されており、手書き数字画像と正解用ラベルのセットとなる。
trainは学習で、validationはハイパーパラメータの学習で、testは作成したモデルの精度を確認する際に使用し、今回のコードでは検証用データは用いていない。
##画像情報
画像一枚は28*28のグレー画像(=1チャンネル)となる
#作成モデル
今回作成したモデルは以下になる
層の深さは、入力層と出力層の2層のみのシンプルなモデルである。
入力層のニューロン数はMNISTの画像を一次元の配列に変換した際に縦×横×チャンネル数(28281)の784となり、出力は0~9の計10個となる
この一次元の配列に変換する方法は隣接するピクセル情報の関係や形状を無視しているが今回はこの方法を用いる。
次回にCNNを用いた方法で推定を行いたいと思う。
#ソースコード
#TensorFlowのインポート
import tensorflow as tf
#数値計算用ライブラリのNumpuのインポート
import numpy as np
#tensorflow.contrib.learn.python.learn.datasets.mnist.pyの関数read_data_setsをインポート
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
#MNISTデータの読み込み
mnist = read_data_sets("MNIST_data/", one_hot=True)
#入力用変数(データ数:Nne 入力データ:784個)
x = tf.placeholder("float", [None, 784])
#重み用変数(0で初期化)
W = tf.Variable(tf.zeros([784, 10]))
#バイアス用変数(0で初期化)
b = tf.Variable(tf.zeros([10]))
#出力(xとWの内積を計算後にバイアスを足した後にソフトマックス回帰を実行)
#ソフトマックス関数を用いることで出力の合計値が1になる(=確率として表せる)
y = tf.nn.softmax(tf.matmul(x, W) + b)
#正解ラベル用の変数(10個のうち1つの値が1で残りが0)
y_ = tf.placeholder("float", [None, 10])
#交差エントロピー誤差を計算(正解ラベルに対応するyの値が大きいほど0に近くなる)
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
#勾配降下法を用いて交差エントロピー誤差を最小化
#学習率は0.001(ハイパーパラメータ)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#セッションで作成したモデルを開始
sess = tf.Session()
#初期化
#tf.initialize_all_variables() -> tf.global_variables_initializer()
sess.run(tf.global_variables_initializer())
#1000回の学習開始
for i in range(1000):
#バッチ処理(trainから100個をランダムに取得)
batch_xs, batch_ys = mnist.train.next_batch(100)
#feet_dictではxとy_のplaceholderに値を置き換え
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
#モデルを評価
#argmax(y,1) : yの中で一番大きな値のインデックスを計算
#tf.equal(,) : 値が一致していればTrue、していなければFalse
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
#tf.cast() : bool型をfloat型にキャスト(True =1, False =0)
#tf.reduce_mean() : 平均値を計算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
#精度計算(=MnistのTestを用いる)
print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
実行結果の精度は約92%となった
#おわりに
今回わかったことは、
・入力xや正解ラベルy_などはplaceholder
・重みWやバイアスbはVariable
を用いるということ。
そして、このコードを実装すればGPUを用いての計算もしてくれるので、簡単に機械学習を試せるライブラリであることがわかったので今後もTensorFlowを使って色々ためしていきたい
#参考にさせていただいたサイト