Help us understand the problem. What is going on with this article?

TensorBoardの最も基本的な使い方

More than 3 years have passed since last update.

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

20170926100138.png

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

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

20170926100008.png

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

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

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

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

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

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

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

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

最後に

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

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

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

tensorflow (1.3.0)
tensorflow-tensorboard (0.1.6)

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

本投稿はこちらのブログの転載です。

TensorFlow自体の勉強メモはこちらのブログに書いていますので、ご興味のある方は見に来てください。

uosansatox
関西在住のWebエンジニアです。Ruby,Rails歴3年です。 趣味でProcessingやp5.jsで作品を作っており、Processing(今はp5.jsのみ)の入門サイトを作りました。 https://processing-fan.firebaseapp.com/ 主にRuby/RailsやJavaScript、数学系の技術ネタを書いています。
https://www.uosansatox.biz/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away