TensorFlowの勉強メモです。
TensorBoardを使ってみたので、出来るだけ分かりやすく解説してみたいと思います。
TensorFlowのコードは主にこちらの書籍を参考にしています。
はじめに
1月から12月までの各月の平均気温の変化を、四次関数で近似するプログラムを例に、TensorBoardの基本的な使い方を解説してみます。
まずはTensorBoardを使わないコードを紹介してから、そのコードへTensorBoardで表示するためのコードを追加していきます。
TensorBoardを使わないで実装
# 必要なライブラリのインポート
import tensorflow as tf
import numpy as np
# 変数の定義
dim = 5
x = tf.placeholder(tf.float32, [None, dim + 1])
w = tf.Variable(tf.zeros([dim+1,1]))
y = tf.matmul(x,w)
t = tf.placeholder(tf.float32, [None, 1])
sess = tf.Session()
# 損失関数と学習メソッドの定義
loss = tf.reduce_sum(tf.square(y - t))
train_step = tf.train.AdamOptimizer().minimize(loss)
# セッションの初期化と入力データの準備
sess.run(tf.global_variables_initializer())
train_t = np.array([5.2, 5.7, 8.6, 14.9, 18.2, 20.4,25.5, 26.4, 22.8, 17.5, 11.1, 6.6])
train_t = train_t.reshape([12,1])
train_x = np.zeros([12, dim+1])
for row, month in enumerate(range(1, 13)):
for col, n in enumerate(range(0, dim+1)):
train_x[row][col] = month**n
# 学習
i = 0
for _ in range(100000):
i += 1
sess.run(train_step, feed_dict={x: train_x, t: train_t})
if i % 10000 == 0:
loss_val = sess.run(loss, feed_dict={x: train_x, t: train_t})
print('Step: %d, Loss: %f' % (i, loss_val))
上記のコードを実行すると、標準出力にステップ番号と損失関数の値が表示されます。
TensorBoardを使うように修正していく
それでは、TensorBoardのコードを書いていきたいと思います。
「損失関数と学習メソッドの定義」と「セッションの初期化と入力データの準備」の間に以下のコードを差し込んでください
# TensorBoardで追跡する変数を定義
with tf.name_scope('summary'):
tf.summary.scalar('loss', loss)
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('./logs', sess.graph)
コードを差し込んだら再度実行してください。
学習が完了したあとにコンソールにtensorboard --logdir=./logs
と入力します。
ブラウザから、localhost:6006へアクセスするとtensorboardの画面が見れると思います。
表示されない場合は、何度か画面を更新してみてください。
SCALARSタブはこんな感じに表示されると思います。
SCALARSタブには、tf.summary.scalarで定義したスカラ値の移り変わりがグラフで表示されます
GRAPHSタブにはこんなグラフが表示されると思います
定義した計算グラフが見やすく表示されています。
見やすいように名前を付ける
ですが、入力値xやtがすべてplaceholderとなっていて、何が何かわかりにくいですよね。
そんな時には、「変数の定義」を以下のように変えてください
dim = 5
with tf.name_scope('X'):
x = tf.placeholder(tf.float32, [None, dim + 1])
with tf.name_scope('W'):
w = tf.Variable(tf.zeros([dim+1,1]))
with tf.name_scope('multi'):
y = tf.matmul(x,w)
with tf.name_scope('T'):
t = tf.placeholder(tf.float32, [None, 1])
sess = tf.Session()
各種変数の上にwith tf.name_scope(変数名):
が付きました。
変数の定義部分はインデントしていることに注意してください。
name_scopeメソッドは、tensorboardの計算フラグを表示するときに、処理をまとめて、名前を付けて見やすくするために使います。
同じように、「損失関数と学習メソッドの定義」にも名前を付けておきましょう
with tf.name_scope('loss'):
loss = tf.reduce_sum(tf.square(y - t))
with tf.name_scope('train'):
train_step = tf.train.AdamOptimizer().minimize(loss)
コードを修正したら、再度実行してください。このときエラーになる場合は、もう一度実行しようとしたときにエラーになる場合を試してみてください。
tensorboardのGRAPHSタブに表示されるグラフが見やすくなったと思います。
もう一度実行しようとしたときにエラーになる場合
少しコードを編集してから、再度実行する場合、エラーになることがあります。そんな時は以下を行ってみてください。
-
(jupyter notebookを使う場合)kernelのリロード
- 画面の上部のKernelメニューからRestartを選んでください
- この場合、tensorflowのインポートなどから再度実行します
-
./logs以下のファイルを削除
- 前回実行結果が残っているとグラフが表示されないので、消しておいてください
最後に
このほかにも、学習パラメータの変化をヒストグラムで表示するとかできるのですが、ヒストグラムを見てもよくわからなかったので割愛しました(笑)
また、tensorboardのバージョンが異なると、tf.summary
あたりの書き方が異なる点も注意してください。
私の環境では以下のバージョンでした。(pip list で確認できます)
tensorflow (1.3.0)
tensorflow-tensorboard (0.1.6)
以上、最も基本的なTensorBoardの使い方でした。
本投稿はこちらのブログの転載です。
TensorFlow自体の勉強メモはこちらのブログに書いていますので、ご興味のある方は見に来てください。