【Keras入門(3)】TensorBoardで見える化

入門者に向けてKerasの初歩を解説します。
TensorBoardも含めて[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を使っているのでローカルでの環境準備すらしていません。Google Colaboratoryについては[「Google Colaboratory概要と使用手順(TensorFlowもGPUも使える)」](https://qiita.com/FukuharaYohei/items/18bc4465923bdda81826)の記事を参照ください。

以下のシリーズにしています。

- [【Keras入門(1)】単純なディープラーニングモデル定義](https://qiita.com/FukuharaYohei/items/579cc0184885b4ba75df)
- [【Keras入門(2)】訓練モデル保存(KerasモデルとSavedModel)](https://qiita.com/FukuharaYohei/items/ac6333391b8abda94bdc)
- 【Keras入門(3)】TensorBoardで見える化
 <- 本記事
- [【Keras入門(4)】Kerasの評価関数(Metrics)](https://qiita.com/FukuharaYohei/items/f7df70b984a4c7a53d58)
- [【Keras入門(5)】単純なRNNモデル定義](https://qiita.com/FukuharaYohei/items/25de4a0faf634ad34efc)
- [【Keras入門(6)】単純なRNNモデル定義(最終出力のみ使用)](https://qiita.com/FukuharaYohei/items/39f865bb53cdd5052179)
- [【Keras入門(7)】単純なSeq2Seqモデル定義](https://qiita.com/FukuharaYohei/items/27cd247342a0f7006511)

また、TensorBoardに関しては以下の記事を参照ください。

- [【TensorBoard入門】TensorFlow処理を見える化して理解を深める](https://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)

##使ったPythonライブラリ
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)でインストール済の以下のライブラリとバージョンを使っています。KerasはTensorFlowに統合されているものを使っているので、ピュアなKerasは使っていません。Pythonは3.6です。

- tensorflow: 1.13.1
- Numpy: 1.16.3

# Pythonプログラム
プログラム全体は[GitHub](https://github.com/YoheiFukuhara/keras-for-beginner/blob/master/Keras05_TensorBoard.ipynb)にあります。ディープラーニングのモデルについては、記事[「【Keras入門(1)】単純なディープラーニングモデル定義](https://qiita.com/FukuharaYohei/items/579cc0184885b4ba75df)を参照ください。

## コールバックとTensorBoardログ保存
KerasでTensorBoardログを保存する場合には、[コールバック](https://keras.io/ja/callbacks/)という機能を使用します。これは、訓練中に呼び出すことができる仕組みです。
記事[「【Keras入門(1)】単純なディープラーニングモデル定義」](https://qiita.com/FukuharaYohei/items/579cc0184885b4ba75df)で使用した[fit関数](https://keras.io/ja/models/model/#fit)に渡すことで使用できます。

```python
model.fit(data, labels, epochs=300, validation_split=0.2, callbacks=li_cb)
```

経験ないですが、[fit_generator関数](https://keras.io/ja/models/model/#fit_generator)にも使えるようです。

fit関数に渡しているli_cbという変数は以下のように定義しています。配列にすることで複数の機能をコールバックで使用できます。今回は、[TensorBoard関数](https://keras.io/ja/callbacks/#tensorboard)を使ったTensorBoardログの保存です。保存先はタイムスタンプを付加したフォルダ名にしておきます。何度も実行した場合に見分けやすくて便利です。

```python
from datetime import datetime
from tensorflow.keras.callbacks import Callback, TensorBoard

# TensorBoardのログ保存先(タイムスタンプを付けておくと見るときに便利)
logdir = "log/run-{}/".format(datetime.utcnow().strftime("%Y%m%d%H%M%S"))

# CallBackの指定
li_cb = []
li_cb.append(TensorBoard(log_dir=logdir, histogram_freq=1, write_graph=True, write_grads=True))
```

## Google Colaboratory上でTensorBoard表示
[TensorFlow2.0だと、簡単にGoogle Colaboratory上でTensorBoardが使えるよう](https://www.tensorflow.org/tensorboard/tensorboard_in_notebooks?hl=ja)ですが、2019年5月時点でのデフォルトのTensorFlow1.13.1では使えないのでひと手間加えます。

[ngrok](https://ngrok.com/)という公開URLで表示させてくれるサービスを使ってTensorBoardを公開させます。
まずは、wgetで取得してunzipします。

```python
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip
```

tensorboardを起動してngrokで公開します。

```python
get_ipython().system_raw(
    'tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'
    .format(logdir)
)
# Tunnel port 6006 (TensorBoard assumed running)
get_ipython().system_raw('./ngrok http 6006 &')
```

cURLで公開URL情報を取得。URLを開けばTensorBoard画面です！
もちろん、ログをダウンロードしてローカルPCで見ることもできます。

```
# ここで表示されたURLを開く
! curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"
```

![03.tensorboard.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/c33ad3fe-d947-b9da-91bc-c98704077ac1.jpeg)