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

#TensorFlowの初心者向けチュートリアル
TensorFlowの初心者向けチュートリアル[MNIST For ML Beginners](https://www.tensorflow.org/get_started/mnist/beginners)を実行しました。筆者は文系卒で**TensorFlowは初めて**で、それどころか**Deep Learningも初めて**。さらには**機械学習もほとんどやったことない状態**です。数学知識は[文系卒社会人が統計・機械学習を理解するための数学勉強方法](http://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)の記事を参考にしてください。
入門者向け目線で解説しています。正確性を欠いている部分も多いですが、わかりやすさを優先して書いています。

######参考リンク
> - [TensorFlowをWindowsにインストール Python初心者でも簡単だった件](http://qiita.com/FukuharaYohei/items/d8f82c827e0bae70096a)
> - [【入門者向け解説】TensorFlow基本構文とコンセプト](http://qiita.com/FukuharaYohei/items/0825c3518d8596c09396)
> - [TensorFlow APIメモ](http://qiita.com/FukuharaYohei/items/f9bb9a0afd47be9ecef8)
> - [【TensorBoard入門】TensorFlow処理を見える化して理解を深める](http://qiita.com/FukuharaYohei/items/7ea120005f73cf882146)
> - [TensorFlowチュートリアルMNIST(初心者向け)をTensorBoardで見える化](http://qiita.com/FukuharaYohei/items/2834cc054a8b8884e150)
> - [【TensorBoard入門:image編】TensorFlow画像処理を見える化して理解を深める](http://qiita.com/FukuharaYohei/items/fae6896e041235033454)
> - [【TensorBoard入門:Projector編】TensorFlow処理をかっこよく見える化](https://qiita.com/FukuharaYohei/items/70f702ee85e23b5b1e26)
> - [【入門者向け解説】TensorFlowチュートリアルDeep MNIST](http://qiita.com/FukuharaYohei/items/0aef74a0411273705512)
> - [TensorFlow理解のために柏木由紀さん顔特徴を調べてみた【前編】](http://qiita.com/FukuharaYohei/items/c3fb29fc8b42e0dfad0f)

#MNIST For ML Beginners概要
概要図としては以下の形です。
![00.Overview.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/1790704d-cb2d-4b5d-4854-9b0c81eb20b4.jpeg)
##1.画像と正解データから学習
[MNIST database](https://en.wikipedia.org/wiki/MNIST_database)(Modified National Institute of Standards and Technology database)に手書き数値の画像とその各画像がどの数値を示しているかの正解データのセットがあります。それらのデータを読み込み、どんな画像であれば、どんな数値かを返すべきかを学習します。
##2.モデル生成
「1.画像と正解データから学習」の結果として、モデルとなる式を作ります。内部的にはこんなイメージのモデルを作ります(0を例としています)。
![00.Overview02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/a64e979e-a8a4-4a57-aa1f-54bdbbea04cc.jpeg)

##3.学習結果の評価
生成したモデルが、どのくらいの正解率を出すか算出します。

#MNIST For ML Beginners実行手順
##実行環境
実行環境は下図のとおりです。Jupyter Notebookから実行しています。
![TensorFlowEnvironment.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/01d7e5ff-cfd8-21ac-0936-61a3918f784b.jpeg)

##1.Jupyter Notebook起動
Anaconda NavigatorはWindowsメニューから起動しています。
そして、Anaconda NavigatorからJupyter Notebookを起動します。
![10.LaunchJupyterNotebook01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/6baaa901-b835-dce4-63cf-f63e24483ed8.jpeg)

![10.LaunchJupyterNotebook02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/3c43587d-1a26-7b85-f57e-7eaf81e43fee.jpeg)

Jupyter Notebookでファイル名を変えます。
![10.LaunchJupyterNotebook03.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/d5d4f33d-4cc9-97c3-8b61-7aa34027b3e2.jpeg)

![10.LaunchJupyterNotebook04.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/70d1b4d2-2b01-9c84-ffa2-2b071c3fa45e.jpeg)
##2.チュートリアル実行
あとはチュートリアルを実行するだけです。
Shift + Enter keyでコマンドの実行です(Enter keyのみだと単なる改行です)。
![20.RunMNIST01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/c126a4c7-aa0c-2ad2-73f2-e99966072761.jpeg)
![20.RunMNIST02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/8dc3f821-546c-58fc-e772-90692094c5cf.jpeg)
最後に出ている"0.9178"が、学習結果の評価で、約92%の正解率とを意味します。
##3.Computational Graph
TensorBoardでComputational Graph(計算式のグラフ)を出力するとこんな感じです。詳しくは[「TensorFlowチュートリアルMNIST(初心者向け)をTensorBoardで見える化」](http://qiita.com/FukuharaYohei/items/2834cc054a8b8884e150)の記事を参照ください。
![40.TensorBoard01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/286f8a0d-22e2-e06e-0c7b-c1f25b973eb3.jpeg)

#各コマンド解説
####0. 概要
MNISTでは、0から9までの数字手書きを28ドット四方のデータとして解釈します。
![MNIST](https://www.tensorflow.org/images/MNIST-Matrix.png)
ただ、それだと当記事での解説には複雑なので縦棒(|)と横棒(-)の2種類手書きデータを5ドット四方のデータとして置き換えます。そうすると下図の形です。
![30.Modeling01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/a9431cf0-3045-b9ba-8281-e3d9dfc4d51a.jpeg)


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

```py3
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
```

####2. TensorFlowライブラリ読込

```py3
import tensorflow as tf
```

####3. モデル定義
3つの変数と回帰モデルを定義します。
x:手書き数値の画像を入れる変数
W:重みづけの値を入れる変数
b:バイアスの値を入れる変数

5ドット四方の縦棒と横棒モデルで上記を説明するとこんな感じです(bのバイアス値は調整変数で、図に含めていません)。$x * W + b$の値で評価できるようにモデルを定義しています。"tf.nn.softmax"(ソフトマックス関数)は、評価のための数値変換程度に思ってください。
![30.Modeling02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/f0183cab-d74c-be3d-f47d-cd7970c11635.jpeg)


```py3
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)の格納変数を定義します。

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

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

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

####6. 訓練方法の定義
"tf.train.GradientDescentOptimizer"(勾配降下法)を使って訓練をします。

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

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

```py3
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
```


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

```py3
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)が高い数値を出力します。

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

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

```py3
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))
```