webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

TensorBoardの最も基本的な使い方

こんにちは、エンジニアのさもです。

前回、TensorFlowの導入として、1年間の月平均気温の移り変わりを4次関数で近似してみました。

www.uosansatox.biz

書籍は以下のものを参考にしています。

TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~

TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~

この書籍に沿って行けば次は別のモデルの実装を行うのですが、ちょっと先回りして、TensorBoardを使ってみたいと思います。

スポンサーリンク

目次

先にTensorBoardをやる理由は、

  1. きれいなグラフやサマリが表示できるとテンションが上がってモチベーションも上がるから
  2. 難しく、複雑なモデルに対して初めてTensorBoardを使うより、単純なモデルで試してみた方が理解が早そうだから

の2点です。

今回は、前回と同じ、平均気温を4次関数で近似するモデルを使っていきます。

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タブはこんな感じに表示されると思います。

f:id:s-uotani-zetakansu:20170926100138p:plain

SCALARSタブには、tf.summary.scalarで定義したスカラ値の移り変わりがグラフで表示されます

GRAPHSタブにはこんなグラフが表示されると思います

f:id:s-uotani-zetakansu:20170926100008p:plain

見ての通り、定義した計算グラフが見やすく表示されています。

見やすいように名前を付ける

ですが、入力値xやtがすべてplaceholderとなっていて、何が何かわかりにくいですよね。

そんな時に使うのがwithです。「変数の定義」を以下のように変えてください

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タブに表示されるグラフが見やすくなったと思います。

f:id:s-uotani-zetakansu:20170926101323p:plain

もう一度実行しようとしたときにエラーになる場合

少しコードを編集してから、再度実行する場合、エラーになることがあります。そんな時は以下を行ってみてください。

  • (jupyter notebookを使う場合)kernelのリロード

    • 画面の上部のKernelメニューからRestartを選んでください
    • この場合、tensorflowのインポートなどから再度実行します
  • ./logs以下のファイルを削除

    • 前回実行結果が残っているとグラフが表示されないので、消しておいてください

最後に

このほかにも、学習パラメータの変化をヒストグラムで表示すとかできるのですが、結果を見てもよくわからなかったので割愛しました。

また、tensorboardのバージョンが異なると、tf.summaryあたりの書き方が異なる点も注意してください。

私の環境では以下のバージョンでした。(pip list で確認できます)

tensorflow (1.3.0)
tensorflow-tensorboard (0.1.6)

以上、最も基本的なTensorBoardの使い方でした。

参考

TensorFlowではじめるDeepLearning実装入門 (impress top gear)

TensorFlowではじめるDeepLearning実装入門 (impress top gear)

初めてのTensorFlow 数式なしのディープラーニング

初めてのTensorFlow 数式なしのディープラーニング

TensorFlow機械学習クックブック Pythonベースの活用レシピ60+ (impress top gear)

TensorFlow機械学習クックブック Pythonベースの活用レシピ60+ (impress top gear)

TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。