TensorFlow の新しい tf.contrib.summary サマリーはどのように評価されますか? 質問する

TensorFlow の新しい tf.contrib.summary サマリーはどのように評価されますか? 質問する

新しいことを理解するのに少し苦労していますtf.contrib.summaryAPI。古いバージョンでは、実行するだけで済んでいたようです。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)

さて、ここでいくつか質問があります。

  1. ループで実行するだけであればsession.run(summaries)、精度の概要は毎回書き込まれると思いますが、損失の概要はグローバル ステップが 30 で割り切れる場合にのみ書き込まれるため、書き込まれないのではないでしょうか。
  2. サマリーが依存関係を自動的に評価すると仮定すると、グラフに依存関係があるため、実行する必要はなくsession.run([accuracy, summaries])、実行するだけで済みますよね?session.run(summaries)
  3. 2) が当てはまる場合、トレーニング ステップに制御依存関係を追加して、トレインの実行ごとに要約が書き込まれるようにするだけでよいのではないでしょうか。それとも、これは悪い習慣でしょうか。
  4. いずれにせよ同時に評価されるものに対して、一般的に制御依存関係を使用することの欠点はありますか?
  5. どしてtf.contrib.summary.scalar(その他) はstepパラメータを受け取りますか?

3) で制御依存関係を追加するということは、次のことを意味します。

tf.control_dependencies(summaries):
    train = tf.train.AdamOptimizer().minimize(loss, global_step=step)

ベストアンサー1

リクエストに応じて回答を編集から自己回答に移動しました


私はこれを少しいじってみたのですが、 と を組み合わせるtf.control_dependenciestf.record_summaries_every_n_global_steps期待通りに動作し、要約は n 番目のステップごとにのみ記録されるようです。しかし、 のようにセッション内で一緒に実行されると、要約はsession.run([train, summs])ときどき保存されますが、正確に n 番目のステップごとに保存されるわけではありません。私はこれを n=2 でテストしましたが、2 番目のアプローチでは要約が奇数ステップで書き込まれることが多く、一方、制御依存アプローチでは常に偶数ステップで書き込まれました。

おすすめ記事