起こった症状
ローカルで実行した時はscalarグラフも表示されるのに、
jupyter notebook上で実行したらscalarグラフが表示されない...
scalar開くと「No scalar data was found」って言われます。
この時のコード
import tensorflow as tf
# 既存のグラフを削除
tf.reset_default_graph()
# tensorboardファイル出力先
logdir = './logdir/'
a = tf.constant(2, name='a')
x = tf.placeholder(tf.int32, name='x')
y = tf.multiply(a, x, name='y')
# yの値をグラフに表示
tf.summary.scalar('y_value', y)
# 全てのサマリーを集約
merged = tf.summary.merge_all()
sess = tf.Session()
if tf.gfile.Exists(logdir):
tf.gfile.DeleteRecursively(logdir)
writer = tf.summary.FileWriter(logdir, sess.graph)
init = tf.global_variables_initializer()
sess.run(init)
for i in range(10):
summary, res = sess.run([merged, y], feed_dict={
x: i
})
writer.add_summary(summary, i)
print('------finish!------')
※このコードをローカルで実行すると、しっかりscalarグラフが表示されます。
対処法
add_summary()の呼出しが全て終了した後の部分に
writer.flush()
って入れます。
こんな感じです
for i in range(10):
summary, res = sess.run([merged, y], feed_dict={
x: i
})
writer.add_summary(summary, i)
'''追記箇所'''
writer.flush()
print('------finish!------')
ポイントは、add_summary()のすぐ後ではなく、add_summary()の呼出しが全て終わってから記述することです。
結果
余談ですが、グラフの曲がり具合は横のsmoothingを動かすと変わります。
こんな感じです。
理由
writer.flush()の説明を見ると、
Flushes the event file to disk.
Call this method to make sure that all pending events have been written to disk.
と記述されているので、イベントが溜まりっぱなしで書き出されてなかったからscalarグラフが表示されなかったようです。
ローカルで実行した時にscalarグラフが表示されたのは、プログラムが終了する時にtensorboardがこれを自動的に行ってくれていたから。
そう考えると確かに、jupyterのセルって一度実行するとそのセルの内容を別のセルでも利用できるから、プログラムが終了してない。
そうなると、勝手に呼び出してくれないので、明示的に記述しないとダメってことなのかな?って思いました。
※jupyterとかプログラムとかに別段詳しい訳ではないので不適切な言い回しなどがあるかもしれないですが、そういう場合はどんどん指摘していただけると嬉しいです!!