ゼロからの最速スタート シリーズ
TensorFlow入門(8)

TensorFlow入門(8)

TensorBoardとは? スカラー値やデータフローグラフの可視化

2018年4月27日

TensorFlowを活用するうえで、TensorBoardは非常に役立つツールだ。スカラー値やデータフローグラフをログファイルとして出力し、可視化する方法を説明する。

安部晃生 DATUM STUDIO 安部 晃生

TensorBoard

 本連載の最後に、TensorBoardを紹介しておく。TensorBoardは、今後読者がTensorFlowを活用していく際に欠かせないツールである。

TensorBoardとは

 TensorFlowには、TensorBoardというダッシュボードツールが付属している。TensorBoardはデータフローグラフの可視化や学習の履歴(損失関数の変化など)の可視化、あるいは途中過程で生成される画像や音声の表示を行うことができる。これにより、モデルの最適化やパラメーターチューニングに対する示唆が得られる。

スカラーの出力

 典型的な利用方法としては、「損失関数の出力値が学習ステップを通して、どのように変化していくか」を折れ線グラフで表示するものである。前回のRNNの損失関数の出力過程を出力してみよう。

 TensorBoardで可視化に利用されるデータは、ログとして出力された結果である。そのログは、tf.summaryモジュールにより提供される。

 ここでは損失関数の出力すなわちスカラー値を可視化したいので、スカラー値のログを出力するためのtf.summary.scalarメソッドを用いる。tf.summaryモジュールにはログを出力するためのtf.summary.FileWriterクラスが定義されており、これを用いてログを出力できる。ログの出力はadd_summaryメソッドを用いればよい。

 次にログ出力に必要なコードの骨格のみを示す。適宜、前回のリスト14のコードに、今回のリスト1の太字部分のコードを差し込めばよい。

Python
# 学習回数
NUM_TRAIN =  10_000
# 学習中の出力頻度
OUTPUT_BY = 500

# 標準化
train_mean = train_dataset.mean()
train_std = train_dataset.std()
standardized_train_dataset = train_dataset.standardize()

# 損失関数の出力をトレース対象とする
loss_summary = tf.summary.scalar('MAE', loss)

# logsディレクトリに出力するライターを作成して利用
with tf.summary.FileWriter('logs') as writer:
  # 学習の実行
  sess.run(tf.global_variables_initializer())
  for i in range(NUM_TRAIN):
    batch = standardized_train_dataset.next_batch(SERIES_LENGTH, BATCH_SIZE)
    summary, mae, _ = sess.run([loss_summary, loss, optimizer], feed_dict={ x: batch[0], y: batch[1]})
    if i % OUTPUT_BY == 0:
      print('step {:d}, error {:.2f}'.format(i, mae))
      # ログの出力
      writer.add_summary(summary, global_step=i)
  # ログの出力
  writer.add_summary(summary, global_step=NUM_TRAIN)
リスト1 損失関数の出力をログファイルとして書き出す

ログのマージ

 通常は、損失関数以外にもさまざまな途中過程をログとして出力したいというケースが多い。つまりトレース対象とする変数が増えるわけだが、そのような場合、複数のスカラー値を1つの変数にマージできる。具体的には、tf.summary.merge_allメソッドを用いると、これまでに定義したスカラー値などのトレース対象をまとめた変数が定義できる。

 これを評価すれば、すべての変数についてのログがとれる。リスト2がそのコード例だ。

 すべての変数ではなく明示的に変数をまとめたい場合は、tf.summary.mergeメソッドを用いる。

Python
# 学習回数
NUM_TRAIN =  10_000
# 学習中の出力頻度
OUTPUT_BY = 500

# 標準化
train_mean = train_dataset.mean()
train_std = train_dataset.std()
standardized_train_dataset = train_dataset.standardize()

# ログ対象とするスカラー値を複数定義する
# 損失関数の出力をトレース対象とする
tf.summary.scalar('MAE', loss)
# ……中略(他にもたくさんのログを対象とする)……
# ログ対象をまとめる
merged = tf.summary.merge_all()

# logsディレクトリに出力するライターを作成して利用
with tf.summary.FileWriter('logs') as writer:
  # 学習の実行
  sess.run(tf.global_variables_initializer())
  for i in range(NUM_TRAIN):
    batch = standardized_train_dataset.next_batch(SERIES_LENGTH, BATCH_SIZE)
    summary, mae, _ = sess.run([merged, loss, optimizer], feed_dict={ x: batch[0], y: batch[1]})
    if i % OUTPUT_BY == 0:
      print('step {:d}, error {:.2f}'.format(i, mae))
      # ログの出力
      writer.add_summary(summary, global_step=i)
  # ログの出力
  writer.add_summary(summary, global_step=NUM_TRAIN)
リスト2 複数のトレース対象のログをマージする

データフローグラフの出力

 tf.summary.FileWriterクラスのインスタンス作成時にgraph引数を指定するか、インスタンス作成後にadd_graphメソッドを用いると、データフローグラフを可視化できる。なお、本稿では省略しているが、各テンソルに名前を付けておけば、その名前が可視化の際に利用される。

Python
# ……省略……
# logsディレクトリに出力するライターを作成して利用
# データフローグラフを出力する
with tf.summary.FileWriter('logs', sess.graph) as writer:
  # ……省略……
リスト3 データフローグラフを出力するための引数指定

 そのまま出力すると、データフローグラフのノードがそのままバラバラに表示されてしまい、見づらくなってしまう(どのように表示されるかは最後にまとめる)。tf.name_scopeメソッドで名前スコープを定義しておくことで、表示単位をまとめることができる。次のリスト4はその例で、前回のリスト12の前半「最終出力(予測)」を「prediction」という名前スコープでまとめたものだ。

Python
# 全結合
with tf.name_scope('prediction'):
  # 重み
  w = tf.Variable(tf.zeros([20, FEATURE_COUNT]))
  # バイアス
  b = tf.Variable([0.1] * FEATURE_COUNT)
  # 最終出力(予測)
  prediction = tf.matmul(last_state, w) + b
リスト4 名前スコープで表示をまとめる

 本稿の例では、同様の手順で、前回示したリスト10/11/12に対して、

  • 「input」名前スコープ: リスト10の後半にある「# 入力」
  • 「rnn」名前スコープ: リスト11の「# RNNセルの作成」
  • 「optimization」名前スコープ: リスト12の後半にある「# 損失関数と最適化」

を定義すればよい。

TensorBoardの起動

 以上の手順でログが取れたら、TensorBoardを起動する。TensorBoardはtensorboardコマンド(リスト5)で起動できる。当然ながら、カレントディレクトリを適切な場所(Jupyter Notebookを使っている場合は.ipynbファイルのあるディレクトリ)に変更してから実行すること。

Bash
$ tensorboard --logdir=logs/
リスト5 TensorBoardを起動するコマンド

「ImportError: cannot import name 'encodings'」というエラーが発生して起動できないときは、pip install html5lib==1.0b8というコマンドを実行するとよい(詳細は「Now broken with html5lib · Issue #318 · xhtml2pdf/xhtml2pdf」を参照されたい)。

 デフォルトでは6006番ポートでWebサーバーが起動するので*1http://localhost:6006/にアクセスするとTensorBoardが表示される(図1)。

  • *1 ポート番号は--portオプションで指定することもできる。
図1 TensorBoardの画面([SCALARS]タブ)

 画面上部のタブ、具体的には[SCALARS]タブでログ出力したスカラー値(図1)や、[GRAPHS]タブでデータフローグラフ(図2)などの表示を切り替えることができる。前述の通り、名前スコープがない場合(図2)とある場合(図3)で異なる。

図2 [GRAPHS]タブ(名前スコープなし)

 図2では全要素が表示されるため全体の内容をつかみづらい。スコープを定義しておけば、図3のようにすっきりと表示される。

[prediction]をダブルクリックすると、そのスコープが拡大表示される

[prediction]をダブルクリックすると、そのスコープが拡大表示される

図3 [GRAPHS]タブ(名前スコープあり)

 以上で本連載は完結である。続編としてChainerで同様の内容を解説するので、ぜひそちらも併せて参照してほしい。

【TL;DR】TensorBoard

  • TensorBoard: TensorFlowに付属するダッシュボードツール。データフローグラフや学習履歴の可視化、途中過程で生成される画像や音声の表示などが行える
  • tf.summaryモジュール: 出力結果のログを提供する。このログが、TensorBoardでのデータの可視化に利用される
  • tf.summary.scalarメソッド: スカラー値のログを取得する
  • tf.summary.FileWriterクラス: ログを出力する。インスタンス作成時にgraph引数を指定すると、データフローグラフを可視化できる
  • tf.summary.merge_allメソッド: 複数のスカラー値を1つの変数にマージできる
  • tf.name_scopeメソッド: 名前スコープを定義しておくことで、表示単位をまとめられる
  • TensorBoardの起動: tensorboard --logdir=logs/コマンドを実行
  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第4回~第8回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

TensorFlow入門(8)
4. CNN(Convolutional Neural Network)を理解しよう(TensorFlow編)

画像認識でよく使われるディープラーニングの代表的手法「CNN」を解説。「畳み込み」「プーリング」「活性化関数」「CNNのネットワーク構成」「ソフトマックス関数」といった基礎と、注意点を押さえよう。

2018年4月23日(月)
TensorFlow入門(8)
5. 画像認識を行う深層学習(CNN)を作成してみよう(TensorFlow編)

ディープラーニングの代表的手法「CNN」により画像認識を行う機械学習モデルを構築してみる。CNNによる深層学習がどのようなものか体験しよう。

2018年4月24日(火)
TensorFlow入門(8)
6. RNN(Recurrent Neural Network)の概要を理解しよう(TensorFlow編)

時系列データの予測でよく使われるディープラーニングの代表的手法「RNN」を解説。そもそも時系列データとは何か? RNNの特徴や、通常のニューラルネットワークの相違点についても押さえよう。

2018年4月25日(水)
TensorFlow入門(8)
7. 時系列データの予測を行う深層学習(RNN)を作成してみよう(TensorFlow編)

ディープラーニングの代表的手法「RNN」により時系列データの予測を行う機械学習モデルを構築してみる。RNNによる深層学習がどのようなものか体験しよう。

2018年4月26日(木)
TensorFlow入門(8)
8. 【現在、表示中】≫ TensorBoardとは? スカラー値やデータフローグラフの可視化

TensorFlowを活用するうえで、TensorBoardは非常に役立つツールだ。スカラー値やデータフローグラフをログファイルとして出力し、可視化する方法を説明する。

2018年4月27日(金)
Deep Insider の SNS :
DATUM AI セミナー≪マーケティング編≫ | DATUM STUDIO株式会社

本コンテンツの目次

TensorFlow入門(8)
TensorFlow入門(8)

TensorBoardとは? スカラー値やデータフローグラフの可視化


本コンテンツに関連する重要用語