スポンサーリンク

tensorflow 2で計算グラフ(超初歩)とtensorBoardで表示(超初歩) ほぼメモ

この記事の目的はとにかく検索すると1.x系列の情報がまずヒットするので手の届くところに最小限の2.x系列で動くサンプルを置いておく事にある。

例1

import tensorflow as tf

a = tf.constant(10.1, dtype=tf.float32, name="a")
b = tf.constant(20.2, dtype=tf.float32, name="b")
c = tf.Variable(30.3, dtype=tf.float32, name="c")
d = tf.Variable(40.4, dtype=tf.float32, name="d")

# @tf.functionを付けると関数のような形で計算グラフを書ける
@tf.function
def f():

  divop = tf.divide(a,b,name="a-div-b")
  addop = tf.math.add(divop,c,name="div-add-c")
  d.assign(addop,name="d-assign-add")
  

# ここでrun
f()

tf.print(d)

例2

import tensorflow as tf

a = tf.constant(10.1, dtype=tf.float32, name="a")
b = tf.constant(20.2, dtype=tf.float32, name="b")
c = tf.Variable(30.3, dtype=tf.float32, name="c")
d = tf.Variable(40.4, dtype=tf.float32, name="d")

# @tf.functionを使わない場合。

divop = tf.divide(a,b,name="a-div-b")
addop = tf.math.add(divop,c,name="div-add-c")
d.assign(addop,name="d-assign-add")

tf.print(d)

TensorBoardで計算グラフを表示してみる

@tf.functionで書かないTensorBoard用出力の方法がどうしてもわからなかったのでとりあえず使ったもの。

この例ではグラフをカレントディレクトリの./output/に出力する

import tensorflow as tf
import os

logdir = './output'
writer = tf.summary.create_file_writer(logdir)
###################################


a = tf.constant(10.1, dtype=tf.float32, name="a")
b = tf.constant(20.2, dtype=tf.float32, name="b")
c = tf.Variable(30.3, dtype=tf.float32, name="c")
d = tf.Variable(40.4, dtype=tf.float32, name="d")

@tf.function
def f():


  divop = tf.divide(a,b,name="a-div-b")
  addop = tf.math.add(divop,c,name="div-add-c")
  d.assign(addop,name="d-assign-add")
  

###################################

with writer.as_default():
  tf.summary.graph(f.get_concrete_function().graph)

  
writer.close()

以下のコマンドでtensorBoardを起動し、ブラウザでhttp://localhost:6006/ を開く。

> tensorboard --logdir ./output

なぜかconstantの名前が消えてx,yになる上にVariableは表示すらされない。散々調べたが表示する方法が見つからなかった。

計算グラフの表示に関してはtf.summary.trace_on(graph=True,profiler=False) でもできる。ちなみにprofiler=Trueにしたら私の環境ではエラーが出たので試せていない。

import tensorflow as tf
import os

logdir = './output'
writer = tf.summary.create_file_writer(logdir)
tf.summary.trace_on(graph=True,profiler=False)
###################################

a = tf.constant(0.01, dtype=tf.float32, name="a")
s = tf.Variable(0.0, dtype=tf.float32, name="s")
v = tf.Variable(0.0, dtype=tf.float32, name="v")


@tf.function
def f():
  s.assign_add(a)
  v.assign(tf.sin(s))


###################################

f() # 一度は計算グラフを走らせないと出力できない

with writer.as_default():
  tf.summary.trace_export("summary", step=0, profiler_outdir="./output")
tf.summary.trace_off()
  
writer.close()

TensorBoardで値の変化を見る

tensorflowはニューラルネットワークを組むために作られた計算グラフ作成ツールであり(という理解をしている)、同じ計算グラフを何度もrunさせて重みを調整していく事を想定しているので、繰り返した場合の値の変化をtensorBoardで確認してみる。

import tensorflow as tf
import os

logdir = './output'
writer = tf.summary.create_file_writer(logdir)

###################################

a = tf.constant(0.01, dtype=tf.float32, name="a")
s = tf.Variable(0.0, dtype=tf.float32, name="s")
v = tf.Variable(0.0, dtype=tf.float32, name="v")


@tf.function
def f():
  s.assign_add(a)
  v.assign(tf.sin(s))

###################################

with writer.as_default():
  for STEP in range(1000): # 1000 回繰り返し
    f() # 計算グラフ実行
    tf.summary.scalar("s",s,step=STEP) # scalarを出力するときは、何回目のループなのかを表すstepを指定しなければいけない
    tf.summary.scalar("v",v,step=STEP)
    writer.flush()

  
writer.close()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: