Tensorflowの利用

### 今回の目標
* Tensorflowでの機械学習
* TensorBoardの使い方

### Tensorflowでの機械学習
TensorflowチュートリアルのMNISTを実行し、TensorBoard使用し学習結果を可視化してみる。

MNIST For ML Beginners
https://www.tensorflow.org/get_started/mnist/beginners

チュートリアルのコードをcloneする

```bash

git clone https://github.com/tensorflow/tensorflow
cd tensorflow/tensorflow/examples/tutorials/mnist

```

今回使用するのはmnist_softmax.py
TensorBoardで視覚化するために少々いじってます。

``` mnist_softmax.py
# coding:utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

FLAGS = None


def main(_):
  # Import data
  mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

  # Create the model
  # xはプレースホルダー(値の入る場所)
  x = tf.placeholder(tf.float32, [None, 784], name="x")

  # Variableは変更可能な値
  W = tf.Variable(tf.zeros([784, 10]), name="W")
  b = tf.Variable(tf.zeros([10]), name="b")

  # ｘW+bを計算
  y = tf.matmul(x, W) + b

  # y_は教師データ(正解の値
  y_ = tf.placeholder(tf.float32, [None, 10], name="y")

  # y(教師データの入力から求まった値)と_y(教師データ)の交差エントロピー(正解の尺度)を求める
  with tf.name_scope("cross-entropy") as scope:
    cross_entropy = tf.reduce_mean(
      tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

  # 再急降下法で交差エントロピーの最小化をする
  with tf.name_scope("training") as scope:
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

  # セッションと変数の初期化
  sess = tf.InteractiveSession()
  tf.global_variables_initializer().run()

  # TensorBoardで視覚化するためのデータ
  summary_writer =  tf.summary.FileWriter('mnist_data', graph=sess.graph)

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

  # 未知のデータの分類するための基準となるモデル
  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}))

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data',
                      help='Directory for storing input data')
  FLAGS, unparsed = parser.parse_known_args()
  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)


```

あとは起動してみる

```bash

> python mnist_softmax.py
Extracting /tmp/tensorflow/mnist/input_data\train-images-idx3-ubyte.gz
Extracting /tmp/tensorflow/mnist/input_data\train-labels-idx1-ubyte.gz
Extracting /tmp/tensorflow/mnist/input_data\t10k-images-idx3-ubyte.gz
Extracting /tmp/tensorflow/mnist/input_data\t10k-labels-idx1-ubyte.gz
.
.
.

0.9157

```

結果が出たのでTensorBoardでNNを視覚化してみる。

```bash
>tensorboard --logdir=C:/work/minst/tensorflow/tensorflow/examples/tutorials/mnist/mnist_data
.
.
.

Starting TensorBoard b'47' at http://0.0.0.0:6006
(Press CTRL+C to quit)

```

logdirが先ほどのコードでsummary_writerで指定したディレクトリ
絶対パスで指定する。

ブラウザで「localhost:6006」にアクセス

![mnist.png](https://qiita-image-store.s3.amazonaws.com/0/177957/8424310b-18b6-7b4e-9ee6-4ce671ddd957.png)



NNが可視化されている。

今回はここまで
次回はチャットボットの作成の前段階になる
Sequence-to-Sequence Modelsの利用について