post Image
TensorBoardの最も基本的な使い方

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自体の勉強メモはこちらのブログに書いていますので、ご興味のある方は見に来てください。


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。