[Keras/TensorFlow] KerasでTensorBoardの利用


目的

ゼロからKerasとTensorFlow(TF)を自由自在に動かせるようになる。
そのための、End to Endの作業ログ(備忘録)を残す。
※環境はMacだが、他のOSでの汎用性を保つように意識。
※アジャイルで執筆しており、精度を逐次高めていく予定。

環境

  • Mac: 10.12.3
  • Python: 3.6
  • TensorFlow: 1.0.1
  • Keras: 2.0.2

To Do

Keras(Tensorflow)の環境構築
KerasでMINSTの学習と予測
KerasでTensorBoardの利用 <---いまココ
Kerasで重みファイルの保存/読み込み
Kerasで自前データの学習と予測
Kerasで転移学習

参考

流れ

TensorBoardを表示されるためには、モデルを学習した時に出力されるlogファイルが必要になる。そのため、log用ディレクトリの作成とサンプルスクリプトにlog吐き出しを追加する必要がある。
ここでは、logのディレクトリの作成、サンプルファイルの作成と実行、TensorBoardを開く。

log用ディレクトリの作成

mkdir ~/tflog

サンプルファイル作成

~/にmnist_mlp_tb.pyを配置

こちらのファイルの以下をベースは変更した。
https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py

スクリプト中の### add for TensorBoard と ### で囲まれた部分が追加箇所。

mnist_mlp_tb.py

from __future__ import print_function

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop


batch_size = 128
num_classes = 10
epochs = 3

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)


### add for TensorBoard
import keras.callbacks
import keras.backend.tensorflow_backend as KTF
import tensorflow as tf

old_session = KTF.get_session()

session = tf.Session('')
KTF.set_session(session)
KTF.set_learning_phase(1)
### 

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])



### add for TensorBoard
tb_cb = keras.callbacks.TensorBoard(log_dir="~/tflog/", histogram_freq=1)
cbks = [tb_cb]
###


history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,

                    ## add 1 line
                    callbacks=cbks,

                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])


### add for TensorBoard
KTF.set_session(old_session)
###

ポイントはログの吐き出し先の指定

tb_cb = keras.callbacks.TensorBoard(log_dir="~/tflog/", histogram_freq=1)

サンプルファイル実行

spyder ~/mnist_mlp_tb.py

実行ボタン▶を押す。

TensorBoardを開く

ターミナルでtensorboardを起動する。
この時にlogディレクトリのパスを与える。

tensorboard --logdir=~/tflog/

ブラウザで以下に接続するとTensorBoardが表示される。

localhost:6006

以下が表示される。

TensorBoardの表示を理解

まずはGRAPHSタブの理解。公式サイトにはいろいろ書いてあり、読解を試みる。
https://www.tensorflow.org/get_started/graph_viz
日本語:http://tensorflow.classcat.com/2016/02/13/tensorflow-how-tos-graph-visualization/

気になっているのは:

  • ブロック(ノード)の意味
  • サブブロック(ノード)の意味
  • ブロックの色の意味
  • 線(リンク)の意味
  • 線の太さの意味
  • 繋がり方の意味

公式サイトから、オブジェの意味を理解してみる。

dense_1のブロックをクリックすると、以下が展開される。そもそもdense_1の基は
model.add(Dense(512, activation='relu', input_shape=(784,)))
であり、ツリー構造を下から上へ辿っていくと、kernelがおそらく入力画像?でbiasと加算してRelu関数に渡される流れ、になっていることが分かる。

執筆中