ITblog

MNIST For ML Beginnersまとめ

2016年07月14日

Tensorflowチュートリアルで、いわゆるHello Worldに該当するMNISTがいきなり難しくて詰まってしまった。

が、それとなく分かってきたのでどういうイメージかをまとめてみる。

MNISTの目的

入力した手書き文字の画像に対して、0〜10何の数字かを類推して出力するモデルを構築する。

プログラムの流れ

//画像データをインポートする。画像データには訓練用の画像mnist.train.imageと、何の数字かを表す0〜10のラベルmnist.train.labelsがセットになっている。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(“MNIST_data/”, one_hot=True)

import tensorflow as tf

//入力の画像。28×28で784の配列で現れる。複数の画像入力に対応するために[None,784]となっている。
x = tf.placeholder(tf.float32, [None, 784])

//画像の重みとバイアス。この部分はセッションにおいて可変であり、この2つの変数を訓練して調整することがプログラムの目的。
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

//入力画像から推定される数字の値を表している。
y = tf.nn.softmax(tf.matmul(x, W) + b)

//正解の数字ラベルの入力配列。0〜10
y_ = tf.placeholder(tf.float32, [None, 10])

//クロスエントロピー。分かりづらいが、入力画像群をモデルを通して得られた推定の数字群と、正解のラベル群の違いの度合いを表している
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

//最急降下法にて、上のクロスエントロピーを最小化することを目的としている処理。0.5は学習係数。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

//セッション開始と初期化処理
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

//1000回のループ。
for i in range(1000):
//55000ある入力画像の中から、100個の画像とラベルをランダムで取り出す
batch_xs, batch_ys = mnist.train.next_batch(100)
//最急降下法にて、クロスエントロピーを最小化するべく重みとバイアスを調整する。この過程をモデルのトレーニングと書かれている。
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

//画像入力に対しての出力のyと、正解のy_を比較し、等しければtrue、違えばfalseの配列を定義する。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

//castすることでtrue→1、false→0の文字列に変換し、平均値を求めている。全て正解であれば1になるが、このケースだと0.9以上の数値で出力される。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

//テスト用画像セットを入力として、訓練したモデルを使って正解率を出力する。
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

まとめ

最初見た時は分かりづらかったが、以下のようなポイントだと理解した。

1・手書き数字の画像を784の長さの配列に見立てる。それぞれ正解の数字もセットとなっている。
2・多くの訓練用の画像を準備することで、正解の数字(0〜9)をそれぞれ表す784の長さの配列(この例では「重み」と呼ばれている)を調整する。入力した画像に一番近似している重みの配列の数字が出力されるようになる。(これが y=softmax(Wx+b)
3・複数の入力画像と正解の画像群を準備することで、最急降下法を使うことで、0〜9の数字を表す重みの配列を調整することが可能となる。多くの訓練用の画像に訓練させるほどモデルの正確さが上がっていく。
4・最後にテスト用の画像を使って出来上がったモデルの精度を確認する。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です