こんにちは、エンジニアのさもです。
前回、TensorFlowの導入として、1年間の月平均気温の移り変わりを4次関数で近似してみました。
書籍は以下のものを参考にしています。
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
この書籍に沿って行けば次は別のモデルの実装を行うのですが、ちょっと先回りして、TensorBoardを使ってみたいと思います。
スポンサーリンク
目次
先にTensorBoardをやる理由は、
- きれいなグラフやサマリが表示できるとテンションが上がってモチベーションも上がるから
- 難しく、複雑なモデルに対して初めて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タブはこんな感じに表示されると思います。
SCALARSタブには、tf.summary.scalarで定義したスカラ値の移り変わりがグラフで表示されます
GRAPHSタブにはこんなグラフが表示されると思います
見ての通り、定義した計算グラフが見やすく表示されています。
見やすいように名前を付ける
ですが、入力値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タブに表示されるグラフが見やすくなったと思います。
もう一度実行しようとしたときにエラーになる場合
少しコードを編集してから、再度実行する場合、エラーになることがあります。そんな時は以下を行ってみてください。
(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)
- 作者: 新村拓也
- 出版社/メーカー: インプレス
- 発売日: 2018/02/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: 足立悠
- 出版社/メーカー: リックテレコム
- 発売日: 2017/10/28
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
TensorFlow機械学習クックブック Pythonベースの活用レシピ60+ (impress top gear)
- 作者: Nick McClure,株式会社クイープ
- 出版社/メーカー: インプレス
- 発売日: 2017/08/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)
- 作者: 有山圭二
- 出版社/メーカー: インプレスR&D
- 発売日: 2016/07/29
- メディア: Kindle版
- この商品を含むブログを見る
読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。