Python
機械学習
DeepLearning
TensorFlow
MNIST

【入門者向け解説】TensorFlowチュートリアルMNIST(初心者向け)

More than 1 year has passed since last update.


TensorFlowの初心者向けチュートリアル

TensorFlowの初心者向けチュートリアルMNIST For ML Beginnersを実行しました。筆者は文系卒でTensorFlowは初めてで、それどころかDeep Learningも初めて。さらには機械学習もほとんどやったことない状態です。数学知識は文系卒社会人が統計・機械学習を理解するための数学勉強方法の記事を参考にしてください。

入門者向け目線で解説しています。正確性を欠いている部分も多いですが、わかりやすさを優先して書いています。


参考リンク




MNIST For ML Beginners概要

概要図としては以下の形です。

00.Overview.JPG


1.画像と正解データから学習

MNIST database(Modified National Institute of Standards and Technology database)に手書き数値の画像とその各画像がどの数値を示しているかの正解データのセットがあります。それらのデータを読み込み、どんな画像であれば、どんな数値かを返すべきかを学習します。


2.モデル生成

「1.画像と正解データから学習」の結果として、モデルとなる式を作ります。内部的にはこんなイメージのモデルを作ります(0を例としています)。

00.Overview02.JPG


3.学習結果の評価

生成したモデルが、どのくらいの正解率を出すか算出します。


MNIST For ML Beginners実行手順


実行環境

実行環境は下図のとおりです。Jupyter Notebookから実行しています。

TensorFlowEnvironment.JPG


1.Jupyter Notebook起動

Anaconda NavigatorはWindowsメニューから起動しています。

そして、Anaconda NavigatorからJupyter Notebookを起動します。

10.LaunchJupyterNotebook01.JPG

10.LaunchJupyterNotebook02.JPG

Jupyter Notebookでファイル名を変えます。

10.LaunchJupyterNotebook03.JPG

10.LaunchJupyterNotebook04.JPG


2.チュートリアル実行

あとはチュートリアルを実行するだけです。

Shift + Enter keyでコマンドの実行です(Enter keyのみだと単なる改行です)。

20.RunMNIST01.JPG

20.RunMNIST02.JPG

最後に出ている"0.9178"が、学習結果の評価で、約92%の正解率とを意味します。


3.Computational Graph

TensorBoardでComputational Graph(計算式のグラフ)を出力するとこんな感じです。詳しくは「TensorFlowチュートリアルMNIST(初心者向け)をTensorBoardで見える化」の記事を参照ください。

40.TensorBoard01.JPG


各コマンド解説


0. 概要

MNISTでは、0から9までの数字手書きを28ドット四方のデータとして解釈します。

MNIST

ただ、それだと当記事での解説には複雑なので縦棒(|)と横棒(-)の2種類手書きデータを5ドット四方のデータとして置き換えます。そうすると下図の形です。

30.Modeling01.JPG


1. MNISTデータインポート

MINSTのデータをインポートしています。"one_hot=True"とすることで、既にローカルにデータが存在した場合はインポートしないことを意味します。

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)


2. TensorFlowライブラリ読込

import tensorflow as tf


3. モデル定義

3つの変数と回帰モデルを定義します。

x:手書き数値の画像を入れる変数

W:重みづけの値を入れる変数

b:バイアスの値を入れる変数

5ドット四方の縦棒と横棒モデルで上記を説明するとこんな感じです(bのバイアス値は調整変数で、図に含めていません)。$x * W + b$の値で評価できるようにモデルを定義しています。"tf.nn.softmax"(ソフトマックス関数)は、評価のための数値変換程度に思ってください。

30.Modeling02.JPG

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)


4. 正解変数の定義

ここで、正解データ(画像xxは数値xx)の格納変数を定義します。

y_ = tf.placeholder(tf.float32, [None, 10])


5. 交差エントロピーの定義

交差エントロピー(クロスエントロピー)の定義。交差エントロピーは予測値と実際値の差異です。

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))


6. 訓練方法の定義

"tf.train.GradientDescentOptimizer"(勾配降下法)を使って訓練をします。

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)


7. セッションの生成と変数初期化

sess = tf.InteractiveSession()

tf.global_variables_initializer().run()


8. 訓練実行

100個のランダムデータを使って1000回訓練を繰り返す。

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})


9. 評価

ここで、予測値と正解の答え合わせをしています。correct_predictionではTrue/Falseでデータを保持しています。

tf.argmaxはデータの中で一番大きい値を取り出す(正解の数値)のこと。tf.argmaxを使って最も可能性(評価値y)が高い数値を出力します。

correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))


10. 評価の計算と出力

True/Falseのデータをtf.castで1 or 0に変えて正答率を計算しています。

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))