ページ

2016年6月11日土曜日

機械学習のフレームワークTensorflowを試す 5 - データフローグラフを可視化(TensorBoard) -


前回やった配列[3, 4, 5]の2乗した値の平均値を算出するデータフローグラフを
可視化してみたいと思います。
可視化するに当たってTensorBoardというツールを使用します。
Tensorflowをインストールすると使えます。
基本的な使い方は
$ tensorboard --logdir=<ログディレクトリのパス>
として実行し、ブラウザでhttp://0.0.0.0:6006にアクセスすると
可視化されたものが見られます。

可視化する為にコード修正

まずは修正前のコードです。
# coding: UTF-8
import tensorflow as tf

array = tf.constant([3,4,5])
square = tf.square(array)
reduce = tf.reduce_mean(square)
sess = tf.Session()
ret = sess.run(reduce)
print(ret) # => 16
このコードを可視化する為にちょこっと修正します。
# coding: UTF-8
import tensorflow as tf

array = tf.constant([3,4,5])
square = tf.square(array)
reduce = tf.reduce_mean(square)
sess = tf.Session()
ret = sess.run(reduce)
# 以下の行を追加
tf.train.SummaryWriter('report', sess.graph)
print(ret) # => 16
tf.train.SummaryWriterクラスを作成する行を追加のしています。
上では第一引数でイベントファイルを出力するディレクトリ名を、
第二引数でセッションのグラフを渡しています。
今回は単純にグラフを表示させるだけです。

TensorBoardで確認

修正したコードを実行するとreportディレクトリが作られているかと思います。
--logdirにreportディレクトリのパスを指定してTensorBoardを起動してみます。
↓ブラウザでアクセスしGRAPHのタグを表示させた結果です。

それっぽいのが表示されています。
丸が定数のノードで、楕円が計算処理を行うノードです。
次に各ノードをクリックして詳細を見てみます。
まずはConstつまりは配列の[3,4,5]です。クリックすると

右上に詳細が表示されています。Attributesにデータ型と値が確認できます。
次はSquareをクリックしてみます。二乗の計算処理を行うノードです。

Inputが先ほどのConstでOutputがRankMeanとなっています。
Meanは最終的な平均値を求める計算処理を行うノードというのは想像できるんですが、 他のRankrangeは、、?
調べてみると、
tf.reduce_meanは引数としてreduction_indiceskeep_dims
の引数を与えることができるようです。
例)
>>> import tensorflow as tf
>>> array = tf.constant([[3.,4.],[5.,6.],[7.,8.]])
>>> reduce = tf.reduce_mean(array)
>>> reduce0 = tf.reduce_mean(array, 0)
>>> reduce1 = tf.reduce_mean(array, 1)
>>> sess = tf.Session()
>>> ret = sess.run(reduce)
>>> ret0 = sess.run(reduce0)
>>> ret1 = sess.run(reduce1)
>>> print(ret)
5.5
>>> print(ret0)
[ 5.  6.]
>>> print(ret1)
[ 3.5  5.5  7.5]
tf.reduce_meanの第二引数で渡しているreduction_indicesの値が
何も指定しない場合は、 (3 + 4 + 5 + 6 + 7 + 8) / 6 = 5.5となります。
0の場合、(3, 5, 7), (4, 6, 8)の平均値を求めます。
(3 + 5 + 7) / 3 = 5(4 + 6 + 8) / 3 = 6
1の場合、(3, 4)、(5, 6), (7, 8)の平均値を求めます。
(3 + 4) / 2 = 3.5(5 + 6) / 2 = 5.5(7 + 8) / 2 = 7.5
どういった平均を求めるか設定してるようです。

今回のサンプルではreduction_indicesに値を
設定していない為、[9,16,25](square)(9 + 16 + 25) / 3 = 16.66...
として計算されています。
Ranktf.rankという次元数を求めるもので、rangetf.rangeという
その名の通り範囲を求めるものです。
reduction_indicesを指定しなかった場合のみ表示されるので、
tf.ranktf.rangeの結果を内部で使っているのではないか・・・と思います。

具体的にここで使ってる!!というのを見つけたかったのですが今回はここまで。

0 件のコメント:

コメントを投稿