1. ホーム
  2. python

[解決済み] TensorFlowの新しいtf.contrib.summaryはどのように評価されるのでしょうか?

2022-04-28 06:58:21

質問

新しい tf.contrib.summary APIです。古いものでは、やることといえば tf.summary.merge_all() をopとして実行します。

しかし、今は、次のようなものがあります。 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)

解決方法は?

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


ちょっと遊んでみたんですが、どうやら tf.control_dependenciestf.record_summaries_every_n_global_steps は期待通りの動作をし、サマリーはn番目のステップごとに記録されるだけです。しかし、もしこれらがセッション内で一緒に実行された場合、例えば session.run([train, summs]) の場合、サマリーはたまに保存されますが、正確にn番目のステップ毎ではありません。n=2でテストしたところ、2番目のアプローチではサマリーが奇数ステップで書き込まれることが多かったのですが、制御依存のアプローチでは常に偶数ステップに書き込まれるようになりました。