中学生にも分かるTensorFlow入門　その4 　プログラムの解説・フローチャート

#はじめに

[前回](http://qiita.com/EtsuroHONDA/items/19d192a15613fae1ec10)、ネットワークやそのモデルについてお話ししましたが、いよいよ今回は[「MNIST For ML Beginners」](https://www.tensorflow.org/versions/master/tutorials/mnist/beginners/index.html)のプログラムについて解説します。このQiitaにもたくさんの記事がありますので特に参考にさせて頂いたものをいくつか挙げておきます

 - [TensorFlowチュートリアル - ML初心者のためのMNIST（翻訳）](http://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf )
 - [TensorFlow MNIST For ML Beginners チュートリアルの実施](http://qiita.com/uramonk/items/c207c948ccb6cd0a1346 )

また、解説に使うソースコードはGoogleがGitHubで公開している[ソースコードmnist_softmax.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py)を使います。これを使う際には、同じディレクトリに[input_data.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/input_data.py)を置いておく必要があるようですのでご注意下さい。

また、プログラムに書かれているいろいろなおまじないのことをAPI（Application Programming Interface ）といいますがこれについては、

 + [TensorFlow Python reference documentation](https://www.tensorflow.org/api_docs/python/index.html)

を参考にしてください。英語ですので少し難しいかもしれません

どうでも良いですが、mninst_softmax.pyのプログラムなら私の大変遅い実行環境でもあっという間に終わりました。Windows環境のまま試してみたい方はWindowsのHyper-Vを使ってUbuntuなどのLinuxディストリビューションをインストールして実行されても十分だと思います


#フローチャート
pythonでプログラムを書いたことがない方でも理解しやすいように、フローチャートを書きその横にコードを載せる方法で説明してみたいと思います
mnist_softmax.pyの最初の数行（コメントを除いた部分）は

```py:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
```
pythonという言語に特有の設定をしている部分ですので解説はしません。とりあえず動かすのに必要なおまじないだと思っておいてください

##データを用意する


![MfBnetworkフローチャートその１.png](https://qiita-image-store.s3.amazonaws.com/0/123035/9cbe49aa-d110-67c5-7d6a-ef7c34644abc.png)



最初の二行は特に解説する必要はないでしょう

```py:
import tensorflow as tf
```
は、これからTensorFlowのライブラリを「tf」という別名で使いますねという宣言です

「データを読み込む」という部分の最初の3行はこれもおまじないだと思ってくださって結構です。データを読み込むディレクトリやデータのファイルがすでにあった場合は再読み込みしないなどの設定が書いてあります

```py:
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
```
とすれば、ファイルが指定されているディレクトリに読み込まれた後、展開され、あとで、
```
mnist.train.next_batch(100)
```
などと書けば自動的にトレーニングデータはトレーニングに使われ、検証用データは検証に使われます。これはMNISTのような標準的にニューラルネットワークの評価に使われるようなデーターベースに関しては、初めから処理するのに便利なような機能がすでに備わっているようです。便利ですね

```py
sess = tf.InteractiveSession()
```

の部分はTensorFlowの様々な機能はC++で書かれたバックエンドで処理されますが、
```
InteractiveSession
```
と書けばその部分と接続され、対話的にモデルの記述などができるようです、詳しくは[Deep MNIST for Expert]()に書かれているようですので[その日本語版](http://qiita.com/KojiOhki/items/64a2ee54214b01a411c7 )なども参考にしてください。とりあえずここはおまじないと考えて頂いても結構です


##モデルを記述するための（テンソル）変数を用意する

![MfBnetworkフローチャートその2.png](https://qiita-image-store.s3.amazonaws.com/0/123035/9b3b0c4d-a94d-f443-6229-e5025eff12da.png)

入力用の画像は一枚あたり$28×28$ピクセルで描かれているようですが、処理される場合は784次元のベクトルで表されるのが一般的のようです。階調は32ビットの浮動小数点で記憶すると書かれています
重みベクトルやバイアスを記憶する変数（コンピュータ上にデータを記憶するメモリ空間を一般に変数と言います）が
```
tf.Variable
```
で定義されているのに対して、入力用の変数ｘが
```
tf.placeholder
```
で記述されているのは画像データをコンピュータで処理できるような形で変更するという意味と、先ほども言いましたがmsinstのような人工知能の評価で標準的に使われるようなデータを一度に一括して処理するためであると思われます

最後にネットワークのモデル

```math

y=softmax(Wx+b)
```

が記述されています。このモデルについては[前回](http://qiita.com/EtsuroHONDA/items/19d192a15613fae1ec10 )お話ししましたのでここでは詳しく説明しません

##交差エントロピー、誤差伝搬型関数の定義
![MfBnetworkフローチャートその3.png](https://qiita-image-store.s3.amazonaws.com/0/123035/2f5ea81c-fe03-d3b6-3fe9-5d0308937868.png)

交差エントロピーとは今回のニューラルネットワークのモデルがトレーニング中に出した答えと正答との誤差を判定するための誤差関数とも呼ばれるものでした。これらも少しだけですが[前回](http://qiita.com/EtsuroHONDA/items/19d192a15613fae1ec10 )お話ししました

また、

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

の部分はバックプロパゲーションによる誤差の修正を定義した部分です。「GradientDescentOptimizer(0.5)」に書かれている数値（ここでは0.5）の部分は学習率と呼ばれるもので、これを大きくすれば早くトレーニングも収束しますが、誤答も増える可能性があるというものです。この調整は実は試行錯誤による場合が多いのです

##トレーニングを行う
![MfBnetworkフローチャートその4.png](https://qiita-image-store.s3.amazonaws.com/0/123035/871835da-11f3-fb64-084c-a1107df0ea3d.png)

さて、いよいよトレーニングです。モデルは記述されましたから、まずはそこで使われる変数をまず初期化する必要があります

そして、トレーニング。ランダムに選ばれた100個のデータを一回のトレーニングに使いこれを1000回繰り返すということを行っています。なぜこのようなことを行っているかというと一回一回のトレーニングを行うループをpythonで記述すると処理が遅くなるためだと思います。なぜ一度に100個のデータかと言えば、これも試行錯誤の結果であるでしょうが、画像データをあまりにもたくさん使うとコンピュータのメモリの容量が不足することもあるからだと思われます

##学習結果のテスト

![MfBnetworkフローチャートその5.png](https://qiita-image-store.s3.amazonaws.com/0/123035/00b020ae-6e10-c9a7-f535-d1a1c14507eb.png)

最後に学習した結果のテストを行っています。特に注記することはないのではないでしょうか。

#おわりに

APIの機能についてはあまり説明しませんでしたが、それは初めはこれはそういうものだと思って試行錯誤しながら、どうしても理解したいなと思ったときは[APIのリファレンス](https://www.tensorflow.org/api_docs/python/index.html )を参考にしながらプログラムを理解していくというのが良いのではないかと思います

最後になりましたが、ここまでお付き合い頂いて本当にありがとうございました。[「その１」](http://qiita.com/EtsuroHONDA/items/02635dc3026e29f3cb41 )ではいろいろとご指摘頂き、本当に勉強になりました。まだまだ未熟者ですので、ほかにもいろいろお教え頂ければ幸いです。またご感想など頂ければ無上の喜びに存じます