TensorFlowの公式チュートリアルをやってみました
mnist_softmax
手書きの文字を推定するプログラム
60000件の訓練データ
10000件のテストデータ
入力は画像データ784(28*28)
入力X 行784 列1
重みW 行訓練データ数 列784
バイアスb 行10 列1
y = softmax(W・x + b)
行列の掛け算(matrix multipilication)
matmul()
softmax関数
確立を表現するため
分類結果が入力データの関数として求められる
すべての出力の総和が1の活性化関数
y1,y2...y10(それぞれ数字の0~9の確立を表す)
正解は0と1で表される
ラベルデータとsoftmaxの出力をできるだけ近くなるように重み(w)とバイアス(b)を求める
クロスエントロピー
コスト関数(誤差)として
推定値と正解ラベルのズレを計算する
プログラムの流れ
MNISRデータの読み込み
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
tensorflowのインポート
import tensorflow as tf
入力と重みとバイアスの設定
placeholder
で空の入れ物用意
Variable
変数
x = tf.placeholder(tf.float32, [None,784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
出力(softmax)
出力は10個の要素、総和すると1となる。
y = tf.nn.softmax(tf.matmul(x,W) + b)
正解ラベル(教師データ)の設定
cross_entropy(交差エントロピー)でy
とy_
の差をどれくらい離れているかを計算する
reduce_mean
(平均)
reduce sum
(総和)
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)
データの初期化
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
バッチで訓練
バッチ100個のランダムなデータで訓練する。1000回繰り返す。
trainの中にある100個データを取り出す。
sess.run(train_step, feed_dict={x: batch_xs, y_:batch_ys})
train_step
SGD(勾配降下法)で指定している
feed_dict={x: batch_xs, y_:batch_ys}
データを与える元、xはバッチのx、yはバッチのy
for _ in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_:batch_ys})
評価
equal
出力と正解ラベルを比較しTrue、Falseを返す。
argmax(y,1)
出力の最大の要素を取り出す。
reduce_mean
精度の平均値
cast
True、Falseを数値(割合)に変換
最後にテストデータで評価する
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_ : mnist.test.labels}))
プログラム
最後にこれまでの流れをまとめたもの記述する。
# coding: utf-8
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf
x = tf.placeholder(tf.float32, [None,784])
W = tf.Variable(tf.zeros([784, 10]))
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)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for _ in range(1000):
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))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_ : mnist.test.labels}))