TensorBoardの最も基本的な使い方

TensorFlowの勉強メモです。

TensorBoardを使ってみたので、出来るだけ分かりやすく解説してみたいと思います。

TensorFlowのコードは主に[こちら](https://www.amazon.co.jp/dp/4839960887/ref=cm_sw_r_tw_dp_x_61XYzb3HB8HD5)の書籍を参考にしています。

# はじめに

1月から12月までの各月の平均気温の変化を、四次関数で近似するプログラムを例に、TensorBoardの基本的な使い方を解説してみます。

まずはTensorBoardを使わないコードを紹介してから、そのコードへTensorBoardで表示するためのコードを追加していきます。

# TensorBoardを使わないで実装

```python
# 必要なライブラリのインポート
import tensorflow as tf
import numpy as np

# 変数の定義
dim = 5
x = tf.placeholder(tf.float32, [None, dim + 1])
w = tf.Variable(tf.zeros([dim+1,1]))
y = tf.matmul(x,w)
t = tf.placeholder(tf.float32, [None, 1])
sess = tf.Session()

# 損失関数と学習メソッドの定義
loss = tf.reduce_sum(tf.square(y - t))
train_step = tf.train.AdamOptimizer().minimize(loss)

# セッションの初期化と入力データの準備
sess.run(tf.global_variables_initializer())

train_t = np.array([5.2, 5.7, 8.6, 14.9, 18.2, 20.4,25.5, 26.4, 22.8, 17.5, 11.1, 6.6])
train_t = train_t.reshape([12,1])
train_x = np.zeros([12, dim+1])
for row, month in enumerate(range(1, 13)):
    for col, n in enumerate(range(0, dim+1)):
        train_x[row][col] = month**n

# 学習

i = 0
for _ in range(100000):
    i += 1
    sess.run(train_step, feed_dict={x: train_x, t: train_t})
    if i % 10000 == 0:
        loss_val = sess.run(loss, feed_dict={x: train_x, t: train_t})
        print('Step: %d, Loss: %f' % (i, loss_val))
```

上記のコードを実行すると、標準出力にステップ番号と損失関数の値が表示されます。

# TensorBoardを使うように修正していく

それでは、TensorBoardのコードを書いていきたいと思います。

「損失関数と学習メソッドの定義」と「セッションの初期化と入力データの準備」の間に以下のコードを差し込んでください

```python
# TensorBoardで追跡する変数を定義
with tf.name_scope('summary'):
    tf.summary.scalar('loss', loss)
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs', sess.graph)
```
コードを差し込んだら再度実行してください。

学習が完了したあとにコンソールに```tensorboard --logdir=./logs```と入力します。

ブラウザから、localhost:6006へアクセスするとtensorboardの画面が見れると思います。

表示されない場合は、何度か画面を更新してみてください。

SCALARSタブはこんな感じに表示されると思います。

![20170926100138.png](https://qiita-image-store.s3.amazonaws.com/0/82541/cac5526c-1875-d250-0cc7-ff1b70fea33e.png)


SCALARSタブには、tf.summary.scalarで定義したスカラ値の移り変わりがグラフで表示されます

GRAPHSタブにはこんなグラフが表示されると思います

![20170926100008.png](https://qiita-image-store.s3.amazonaws.com/0/82541/93e0efed-49cc-eee8-ac5e-9c4f0c8d38ed.png)


定義した計算グラフが見やすく表示されています。

# 見やすいように名前を付ける

ですが、入力値xやtがすべてplaceholderとなっていて、何が何かわかりにくいですよね。

そんな時には、「変数の定義」を以下のように変えてください

```python
dim = 5
with tf.name_scope('X'):
    x = tf.placeholder(tf.float32, [None, dim + 1])
with tf.name_scope('W'):
    w = tf.Variable(tf.zeros([dim+1,1]))
with tf.name_scope('multi'):
    y = tf.matmul(x,w)
with tf.name_scope('T'):
    t = tf.placeholder(tf.float32, [None, 1])
sess = tf.Session()
```
各種変数の上に```with tf.name_scope(変数名):```が付きました。

変数の定義部分はインデントしていることに注意してください。

name_scopeメソッドは、tensorboardの計算フラグを表示するときに、処理をまとめて、名前を付けて見やすくするために使います。

同じように、「損失関数と学習メソッドの定義」にも名前を付けておきましょう

```python
with tf.name_scope('loss'):
    loss = tf.reduce_sum(tf.square(y - t))
with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer().minimize(loss)
```

コードを修正したら、再度実行してください。このときエラーになる場合は、<a href="#もう一度実行しようとしたときにエラーになる場合">もう一度実行しようとしたときにエラーになる場合</a>を試してみてください。

tensorboardのGRAPHSタブに表示されるグラフが見やすくなったと思います。
![20170926101323.png](https://qiita-image-store.s3.amazonaws.com/0/82541/89e16059-2594-dae5-b834-27964982f919.png)



# もう一度実行しようとしたときにエラーになる場合

少しコードを編集してから、再度実行する場合、エラーになることがあります。そんな時は以下を行ってみてください。

* (jupyter notebookを使う場合)kernelのリロード
  * 画面の上部のKernelメニューからRestartを選んでください
  * この場合、tensorflowのインポートなどから再度実行します

* ./logs以下のファイルを削除
  * 前回実行結果が残っているとグラフが表示されないので、消しておいてください

# 最後に

このほかにも、学習パラメータの変化をヒストグラムで表示するとかできるのですが、ヒストグラムを見てもよくわからなかったので割愛しました（笑）

また、tensorboardのバージョンが異なると、```tf.summary```あたりの書き方が異なる点も注意してください。

私の環境では以下のバージョンでした。(pip list で確認できます)

```
tensorflow (1.3.0)
tensorflow-tensorboard (0.1.6)
```

以上、最も基本的なTensorBoardの使い方でした。

本投稿は[こちら](http://www.uosansatox.biz/entry/2017/09/26/102354)のブログの転載です。

TensorFlow自体の勉強メモはこちらのブログに書いていますので、ご興味のある方は見に来てください。