新しいことを理解するのに少し苦労していますtf.contrib.summary
API。古いバージョンでは、実行するだけで済んでいたようです。tf.summary.merge_all()
それをオペレーションとして実行します。
しかし今では、tf.contrib.summary.record_summaries_every_n_global_steps
次のように使用できます。
import tensorflow.contrib.summary as tfsum
summary_writer = tfsum.create_file_writer(logdir, flush_millis=3000)
summaries = []
# First we create one summary which runs every n global steps
with summary_writer.as_default(), tfsum.record_summaries_every_n_global_steps(30):
summaries.append(tfsum.scalar("train/loss", loss))
# And then one that runs every single time?
with summary_writer.as_default(), tfsum.always_record_summaries():
summaries.append(tfsum.scalar("train/accuracy", accuracy))
# Then create an optimizer which uses a global step
step = tf.create_global_step()
train = tf.train.AdamOptimizer().minimize(loss, global_step=step)
さて、ここでいくつか質問があります。
- ループで実行するだけであれば
session.run(summaries)
、精度の概要は毎回書き込まれると思いますが、損失の概要はグローバル ステップが 30 で割り切れる場合にのみ書き込まれるため、書き込まれないのではないでしょうか。 - サマリーが依存関係を自動的に評価すると仮定すると、グラフに依存関係があるため、実行する必要はなく
session.run([accuracy, summaries])
、実行するだけで済みますよね?session.run(summaries)
- 2) が当てはまる場合、トレーニング ステップに制御依存関係を追加して、トレインの実行ごとに要約が書き込まれるようにするだけでよいのではないでしょうか。それとも、これは悪い習慣でしょうか。
- いずれにせよ同時に評価されるものに対して、一般的に制御依存関係を使用することの欠点はありますか?
- どして
tf.contrib.summary.scalar
(その他) はstep
パラメータを受け取りますか?
3) で制御依存関係を追加するということは、次のことを意味します。
tf.control_dependencies(summaries):
train = tf.train.AdamOptimizer().minimize(loss, global_step=step)
ベストアンサー1
リクエストに応じて回答を編集から自己回答に移動しました
私はこれを少しいじってみたのですが、 と を組み合わせるtf.control_dependencies
とtf.record_summaries_every_n_global_steps
期待通りに動作し、要約は n 番目のステップごとにのみ記録されるようです。しかし、 のようにセッション内で一緒に実行されると、要約はsession.run([train, summs])
ときどき保存されますが、正確に n 番目のステップごとに保存されるわけではありません。私はこれを n=2 でテストしましたが、2 番目のアプローチでは要約が奇数ステップで書き込まれることが多く、一方、制御依存アプローチでは常に偶数ステップで書き込まれました。