Tensorboardの使い方まとめ

# TensorFlow

Tensorboadと直接関係のあるTensorflowの全体像は以下。

- [Low Level API](https://www.tensorflow.org/guide/low_level_intro)

# 起動方法

## JupyterNoteBook起動

### 起動コマンド

```bash:kannkyo/jupyter.sh
cd ~/
docker run --runtime=nvidia -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 -p 6006:6006 tensorflow/tensorflow:1.12.0-gpu-py3
```
from https://gist.github.com/kannkyo/8626729f0453b562146d17c25acdbaf9

### 画面確認

http://localhost:8888

## Tensorboard起動

### 起動要件

- ブラウザ：Google Chrome or Firefox

### 起動コマンド

Jupyternotebookで New > Terminalを選択。Terminalで以下のコマンドを実行。

```bash:kannkyo/tensorboard.sh
tensorboard --logdir ./logs
```
from https://gist.github.com/kannkyo/03281eab59e3cca7a471727cae3543f1

### 画面確認

http://localhost:6006/

# Tensorboardのキーコンセプト

## TensorFlowデータ収集方式

### audio

```python:audio
tf.summary.audio(
    name,
    tensor,
    sample_rate,
    max_outputs=3,
    collections=None,
    family=None
)
```
from https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/summary/audio

### histogram

```python:histogram
tf.summary.histogram(
    name,
    values,
    collections=None,
    family=None
)
```
from https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/summary/histogram

### image

```python:image
tf.summary.image(
    name,
    tensor,
    max_outputs=3,
    collections=None,
    family=None
)
```
from https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/summary/image

### scalar

```python:scalar
tf.summary.scalar(
    name,
    tensor,
    collections=None,
    family=None
)
```
from https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/summary/scalar

### text

```python:text
tf.summary.text(
    name,
    tensor,
    collections=None
)
```
from https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/summary/text

## データ名のタグ付け方式

tag名は directory/like/hierarchy のように与える。 scalar と histogram ダッシュボードはtag名でグルーピングされる。


## データロード方式

- logdirで知られる特定のディレクトリに、TensorFlowから取得したサマリのデータを書き込む。
- ファイル名がtfeventsで始まるファイルに追記モードでダンプする。
- TensorBoardはlogdir内の全データを読み込む。処理を中断した場合を考えて自動的に全ファイル読み込むらしい。

## モデルの実行結果比較方式

複数のTensorflowの実行結果を比較できる。

```bash:1つのディレクトリのサブディレクトリに格納
tensorboard --logdir /some/path/mnist_experiments
```

```bash:2つのディレクトリに別々に格納
tensorboard --logdir name1:/path/to/logs/1,name2:/path/to/logs/2
```

# 可視化

## Scalar Dashboard

- 統計スカラー量の時間変化を可視化する。

## Histogram Dashboard

- `tf.summary.histogram`を通じて統計分布の時間変化を可視化する。

## Distribution Dashboard

- `tf.summary.histogram`を通じて可視化するもう一つの方法。高レベルな統計を表示する。
- 9本の折れ線が描かれていて、それぞれ`[maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]`を意味する。
- 折れ線が境目になっている3色の領域があり、これは内側から`[σ, 2σ, 3σ]`の幅を意味する。
- [チュートリアル](https://www.tensorflow.org/guide/tensorboard_histograms) 参照。

## Image Dashboard

- `tf.summary.image`を通じてPNG画像を可視化する。
- 行がtagに対応し、列がrunの実行に対応する。
- 各tagの最新画像を表示する。

## Audio Dashboard

- `tf.summary.audio`を通じてplayable audio widgetsを表示する。
- 行がtagに対応し、列がrunの実行に対応する。
- 各tagの最新オーディオを表示する。

## Graph Explorer

- TensorFlowモデルの検査を可能にするグラフ図。

## Embedding Projector

- 高次元データを可視化する。語彙等。
- [チュートリアル](https://www.tensorflow.org/get_started/embedding_viz)

## Text Dashboard

- `tf.summary.text`を通じてテキストを表示する。
- ハイパーリンク、リスト及び表を含むMarkdownをサポートする。

# サンプル

## Histogram & Distribution Dashboard

### 手順

- [チュートリアル](https://www.tensorflow.org/guide/tensorboard_histograms)のソースコードのパス名を logsに変更。
- jupyter note bookで実行。

```diff:変更点
# Setup a session and summary writer
sess = tf.Session()
- writer = tf.summary.FileWriter("/tmp/histogram_example")
+ writer = tf.summary.FileWriter("./logs")
```

### 実行結果

#### Distribution

![Distribution.png](https://qiita-image-store.s3.amazonaws.com/0/114392/305745d1-f226-845b-b3cd-23ae04b02f3a.png)

#### Histogram

![Histogram.png](https://qiita-image-store.s3.amazonaws.com/0/114392/a410b5dc-3b76-4357-22b7-49626da1192b.png)

## Embedding Projector

### 手順

- [TensorBoard Dev Summit Tutorial](https://github.com/decentralion/tf-dev-summit-tensorboard-tutorial/blob/master/mnist.py)のソースコードのパス名を logsに変更。
- jupyter note bookで実行。

```diff:変更点
import os
import os.path
import shutil
import tensorflow as tf

- LOGDIR = "/tmp/mnist_tutorial/"
+ LOGDIR = "./logs"
```

### 実行結果

#### Projector

![Projector.png](https://qiita-image-store.s3.amazonaws.com/0/114392/2becf955-f7a0-c6f5-310d-731110896dde.png)

## Some Dashboard & Graph Explorer

### 手順

- MNISTを用いたScalar & Image & Histogram & Distribution DashboardとGraph Explorerの例。
- [mnist_with_summaries.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py)のログディレクトリを変更。
- jupyter note bookで実行。

```diff:変更点
  parser.add_argument(
      '--log_dir',
      type=str,
+     default=os.path.join('./logs'),
-     default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),
-                           'tensorflow/mnist/logs/mnist_with_summaries'),
      help='Summaries log directory')
  FLAGS, unparsed = parser.parse_known_args()
  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
```

friom https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py

### 実行結果

#### Distribution

![Distribution.png](https://qiita-image-store.s3.amazonaws.com/0/114392/82fbc019-414a-091b-2b79-8e2bc413b52b.png)

#### Graphs

![Graphs.png](https://qiita-image-store.s3.amazonaws.com/0/114392/8072c92f-7998-2d71-ae75-458a5334b09e.png)

#### Histogram

![Histogram.png](https://qiita-image-store.s3.amazonaws.com/0/114392/64691dbd-b3da-6a1f-c0cf-658aff6acd29.png)

#### Images

![Images.png](https://qiita-image-store.s3.amazonaws.com/0/114392/52c2f888-f8c3-5673-a37b-8394e831d22f.png)

#### Scalar

![Scalar.png](https://qiita-image-store.s3.amazonaws.com/0/114392/5b04234f-44f2-d307-87ab-5637ea3b86e1.png)
 

# 参考文献

- [TensorBoard: Visualizing Learning](https://www.tensorflow.org/guide/summaries_and_tensorboard)
- [tensorflow/tensorboard](https://github.com/tensorflow/tensorboard)
- [あらゆるデータを可視化するTensorBoard徹底入門](https://deepage.net/tensorflow/2017/04/25/tensorboard.html)
    - バージョンが古い。