TensorBoardのEventsによる学習状況の可視化
TensorFlowに学習状況を可視化するTensorBoardというツールがあるのだが、 コスト関数と精度を可視化してみたかったので使ってみた。
実装
Deep Learning入門としてのFizzBuzz問題
のモデル学習のメソッドをベースにしている。
コメント# Logging data for TensorBoard
と# Write log to TensorBoard
の直下のコードがTensorBoardを利用する部分のコード。
def train_model(self, data, model): # dataのセット train_X = data[0] train_Y = data[1] test_X = data[2] test_Y = data[3] # modelのセット X = model['X'] Y = model['Y'] Y_ = model['Y_'] loss = model['loss'] train_step = model['train_step'] # 定義 accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)), tf.float32)) # 初期化 sess = tf.InteractiveSession() tf.initialize_all_variables().run() # Logging data for TensorBoard _ = tf.scalar_summary('loss', loss) _ = tf.scalar_summary('accuracy', accuracy) writer = tf.train.SummaryWriter('./log/', graph_def=sess.graph_def) for epoch in range(10000+1): # データのランダマイズ p = np.random.permutation(range(len(train_X))) train_X, train_Y = train_X[p], train_Y[p] # 学習 for start in range(0, train_X.shape[0], 100): end = start + 100 sess.run(train_step, feed_dict={X: train_X[start:end], Y_: train_Y[start:end]}) # テスト if epoch % 100 == 0: # 教師データのコスト関数 loss_train = sess.run(loss, feed_dict={X: train_X, Y_: train_Y}) # 教師データの精度 accu_train = sess.run(accuracy, feed_dict={X: train_X, Y_: train_Y}) # テストデータのコスト関数 loss_test = sess.run(loss, feed_dict={X: test_X, Y_: test_Y}) # テストデータの精度 accu_test = sess.run(accuracy, feed_dict={X: test_X, Y_: test_Y}) # 標準出力 std_output = 'Epoch: %s, \t Train Loss: %s, \t Train Accracy: %s, \t Test Loss: %s, \t Test Accracy: %s' print std_output % (epoch, round(loss_train, 6), round(accu_train, 6), round(loss_test, 6), round(accu_test, 6)) # Write log to TensorBoard summary_str = sess.run(tf.merge_all_summaries(), feed_dict={X: test_X, Y_: test_Y}) writer.add_summary(summary_str, epoch)
解説
コスト関数は引数として渡される。 実装はコメントの通り。
# loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(Y, Y_)) loss = model['loss']
精度は以下の通り。 詳しい実装内容はこちらを参照。
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)), tf.float32))
ここからが、TensorBoardの実装部分。 1、2行目は可視化したいコスト関数と精度の変数を出力名と共に、tf.scalar_summary()に渡している。 3行目は出力先を指定している。
# Logging data for TensorBoard _ = tf.scalar_summary('loss', loss) _ = tf.scalar_summary('accuracy', accuracy) writer = tf.train.SummaryWriter('./log/', graph_def=sess.graph_def)
tf.merge_all_summaries()は上記で設定した_
(コスト関数と精度)を指す。
これらにfeed_dictに指定したテストデータとテストラベルを渡して、結果をTensorBoardに出力する。
出力間隔はepochとしたので、for文の中で定義している。
for epoch in range(10000+1): ... # Write log to TensorBoard summary_str = sess.run(tf.merge_all_summaries(), feed_dict={X: test_X, Y_: test_Y}) writer.add_summary(summary_str, epoch)
学習終了したら、別ターミナルで以下のコードを実行すると、 http://0.0.0.0:6006からTensorBoardを見ることができる。 ただし、1行目はvirtualenvの場合のみ実行。
$ source ~/tensorflow/bin/activate (tensorflow) $ python ~/tensorflow/lib/python2.7/site-packages/tensorflow/tensorboard/tensorboard.py --logdir=./log/ Starting TensorBoard 16 on port 6006 (You can navigate to http://0.0.0.0:6006)
結果
次のように可視化される。 accuracyがサッチってないので、バッチ数などのパラメーターを変えるか、epoch数を増やす必要があることが分かる。