GoogleColabo上のKerasからTensorBoardを使う例

## 概要
機械学習入門者向け。GoogleColaboのKerasからTensorBoardを使う例。
モデルサンプルはXOR、
Ngrok経由でTensorBoardにアクセスする
## 環境
 - Google Colaboratory
 - Keras

## 参考
- [【データ可視化】TensorBoardのProjectorをKerasとColaboratoryで実行する](https://qiita.com/maro_amoeba/items/2d959df3922ec7316d84)
- [03_mlp_xor_keras.py](https://github.com/yusugomori/deeplearning-tensorflow-keras/blob/r1.8/3/keras/03_mlp_xor_keras.py)

## TensorBoradの準備（ngrok, tensorboard）
下記を実行するとngrokのインストール、tensorBoard起動、公開用URL出力が行われる

```python:colabo
import os
# ngrokのインストール
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip -o ngrok-stable-linux-amd64.zip

# TensorBoardのlogフォルダ
LOG_DIR = './log'
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

# TensorBoardをバックグラウンドで実行
get_ipython().system_raw(
    'tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'
    .format(LOG_DIR))

# ngrokバックグラウンドプロセスを起動
# TensorBoardのポート6006を開放します。
get_ipython().system_raw('./ngrok http 6006 &')

# TensorBoard表示のURLを取得
# localhost:4040でNgrokのステータスをJsonで取得してpublicUrlをPrintしている
!curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

```
公開用URLが取得できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/38af5520-c0ea-fb1d-59f9-e82f87218abd.png)

## Kerasでモデル実行
### モデルの定義
```python

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD, RMSprop
from keras.callbacks import TensorBoard

np.random.seed(123)

'''
データの生成
'''
# XORゲート
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Y = np.array([[0], [1], [1], [0]])

'''
モデル設定
'''
model = Sequential()

# 入力層 - 隠れ層
model.add(Dense(input_dim=2, units=2))
model.add(Activation('sigmoid'))

# 隠れ層 - 出力層
model.add(Dense(units=1))
model.add(Activation('sigmoid'))

# summary
model.summary()

##モデルコンパイル
model.compile(loss='binary_crossentropy', 
              optimizer=SGD(lr=0.1) ,
              metrics=['accuracy'])
```
モデルのサマリーが表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/12f04db2-3895-818f-9fdb-dcc3ea514f68.png)

###モデルの学習、TensorBoardへの書込み
コールバックを設定することでTensorBoardへの書込ができる

```python
batch_size = 4 
epochs = 4000 
histogram_freq=500 # TensorBoardのhistogram書込頻度設定
'''
モデル学習
'''
# 訓練中に適応するコールバックを作成
# https://keras.io/ja/callbacks/#tensorboard
tb = TensorBoard(log_dir=LOG_DIR, histogram_freq=histogram_freq, 
                 batch_size=batch_size, 
                 write_graph=True, write_grads=True, write_images=True)

history = model.fit(X, Y
          , epochs=epochs
          , batch_size=batch_size
          , verbose=0
          , validation_data=(X, Y)
          , callbacks=[tb] # Call Back
         )
```

### モデル評価、学習結果の確認
```py
'''
モデル評価
'''
# 損失値と正解率を取得
score = model.evaluate(X, Y, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
'''
学習結果の確認
'''
classes = model.predict_classes(X, batch_size=4)
prob = model.predict_proba(X, batch_size=4)

print('classified:')
print(Y == classes)
print()
print('output probability:')
print(prob)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/0a2de855-3406-2206-030d-dfc0f25d3db9.png)

### TensorBoardにアクセス
Ngrockの公開用URLにアクセスしてTensorBoardを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/846322e8-c4ea-67ad-c160-58ede94713c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/7818aaf6-d91a-a5d6-460b-e3ac091efce9.png)

以上。

### その他
TensorBoardの使い方がよくわからない。