TensorFlowのグラフをJupyter上で可視化する ― tfgraphvizの紹介

  • 15
    いいね
  • 0
    コメント

はじめに

TensorFlowにはTensorBoardという視覚化ツールが用意されています。TensorBoardを使うとニューラルネットのグラフや学習状況をインタラクティブに確認することができるので大変便利です。

しかし、TensorBoardの利用には「ログの書き出し→サーバ起動→ブラウザ起動」の手間があったり、GRAPHで表示されるグラフはノード名が途中で「...」で丸められてしまって他人に説明するには使いづらかったり、データサイエンス系で人気のJupyter notebookと連携できないといった面倒な点があります。

そこで、TensorFlowで構築したグラフをDOT言語+graphvizによって可視化するモジュールtfgraphvizを作りました。tfgraphvizを使うことで、グラフを簡単に画像化したり、TensorBoardのGRAPH機能と同等の機能をJupyter notebook上で実現することができます。

tfgraphvizのプロジェクトページ

デモ画像

Jupyter notebook上のデモ

jupyter_sample.jpg

ipynbのリンク

比較

項目 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

使い方

基本的な使い方

  1. TensorFlowでグラフを構築する
  2. tf.Graphオブジェクトをtfg.board(...)に渡す

tfg.board(...)で返されるのはgraphvizのオブジェクトなので、以下のようなことができます。

  • g.sourceでDOT言語のコードを表示
  • g.graph_attrg.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)と同じ)

001.jpg

tfg.board(..., depth=2)とした場合

002.jpg

おまけ

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 "![](http://g.gravizo.com/g?%s)" % g.source

実行結果:

![](http://g.gravizo.com/g?digraph G {
    a [label=a]
    add [label=add]
    b [label=b]
        a -> add
        b -> add
})

Markdown文書に貼り付けた結果

他のML系モジュール

Kerasだと、keras.utils.visualize_util.model_to_dotという関数があってモデルをDOT言語として表現することができるみたいです(もっと早く確認しておけばよかった…)。

[追記] エッジ内にTensorの次元を表示

tfgraphviz0.0.4から、TensorBoardと同じようにTensorのshapeを表示できるようにしました。

https://pypi.python.org/pypi/tfgraphviz/0.0.4

Jupyter Notebook上でのサンプルコード:

import tensorflow as tf
import tfgraphviz as tfg

x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

tfg.board(tf.get_default_graph(), depth=1)

実行結果:

参考

おわりに

自分でスライドやレポート等に使う分には十分かなと思います。ついでにTensorFlowのドキュメントをいくつか読んだのでこっちの勉強にもなりました。

別の方法を見つけたので、記事にしました。