はじめに
TensorFlowにはTensorBoardという視覚化ツールが用意されています。TensorBoardを使うとニューラルネットのグラフや学習状況をインタラクティブに確認することができるので大変便利です。
しかし、TensorBoardの利用には「ログの書き出し→サーバ起動→ブラウザ起動」の手間があったり、GRAPHで表示されるグラフはノード名が途中で「...」で丸められてしまって他人に説明するには使いづらかったり、データサイエンス系で人気のJupyter notebookと連携できないといった面倒な点があります。
そこで、TensorFlowで構築したグラフをDOT言語+graphvizによって可視化するモジュールtfgraphvizを作りました。tfgraphvizを使うことで、グラフを簡単に画像化したり、TensorBoardのGRAPH機能と同等の機能をJupyter notebook上で実現することができます。
デモ画像
Jupyter notebook上のデモ
比較
| 項目 | TensorBoard | tfgraphviz |
|---|---|---|
| インタラクティブ | 直観的にノード情報が確認できる | 特になし |
| 表示の手間 | サーバを立ち上げてブラウザ起動 | プログラム内で表示 |
| 共有 |
tf.summary.FileWriterで出力されたログファイルを共有 |
DOTを共有 |
| 再編集 | 特になし | DOTを編集すれば見た目を変えられる |
(注意:あくまでも恣意的な評価)
インストール
DOT言語を扱うためのgraphvizとそのPythonバインディングが必要になります。
$ brew install graphviz
$ pip install tfgraphviz
実行環境メモ: OSX 10.11、Python 2.7.12、TensorFlow 1.0.0、graphviz 2.40.1、graphviz 0.5.2(Pythonの方)、tfgraphviz 0.0.2
使い方
基本的な使い方
- TensorFlowでグラフを構築する
-
tf.Graphオブジェクトをtfg.board(...)に渡す
tfg.board(...)で返されるのはgraphvizのオブジェクトなので、以下のようなことができます。
-
g.sourceでDOT言語のコードを表示 -
g.graph_attrやg.node_attrなどをいじって好みのスタイルに変更 -
g.view()でpdfファイルに変換
graphvizの使い方については公式ドキュメントが参考にしてください。
単回帰のサンプルコード:
import numpy as np
import tensorflow as tf
import tfgraphviz as tfg
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
tfg.board(tf.get_default_graph())
# tfg.board(..., depth=2)のように`name scope`の深さを指定可能。デフォルトはdepth=1
実行結果
キーワード引数のdepthを指定することで、どのくらいname scopeを深くトラバースするかを指定することができます。
tfg.board(...)(tfg.board(..., depth=1)と同じ)
tfg.board(..., depth=2)とした場合
おまけ
gravizoというWebサービスを使うことで、DOT言語だけで画像を載せることができます。ただし、tfgraphvizから扱うにはgraphvizのスタイル情報を削除する必要があります。
gravizoを使ってMarkdown内でGraphvizのグラフを表示する - Qiita
import tensorflow as tf
import tfgraphviz as tfg
a = tf.constant(1, name="a")
b = tf.constant(2, name="b")
c = tf.add(a, b, name="add")
tf_graph = tf.get_default_graph()
g = tfg.board(tf_graph, style=False)
print "" % g.source
実行結果:

Markdown文書に貼り付けた結果
tfgraphvizのプロジェクトページ
他のML系モジュール
Kerasだと、keras.utils.visualize_util.model_to_dotという関数があってモデルをDOT言語として表現することができるみたいです(もっと早く確認しておけばよかった…)。
参考
おわりに
自分でスライドやレポート等に使う分には十分かなと思います。ついでにTensorFlowのドキュメントをいくつか読んだのでこっちの勉強にもなりました。