我使用
keep_prob_val = tf.sub(1.0, tf.train.exponential_decay(1 - FLAGS.keep_prob, global_step, FLAGS.decay_steps, FLAGS.dropout_decay_rate, staircase=False))
keep_prob_summary = tf.scalar_summary('params/keep_prob', keep_prob_val)
并设置一些合并的摘要
train_writer = tf.train.SummaryWriter(FLAGS.train_dir.format(log_id), tf.get_default_graph())
test_writer = tf.train.SummaryWriter(test_dir)
merged = tf.merge_all_summaries()
但是当我随后
sess.run(train_step, feed_dict={x: xs, y_: ys,
keep_prob: sess.run(keep_prob_val)})
# ...
test_writer.add_summary(sess.run(merged, feed_dict={ ..., keep_prob: some_val}),
global_step=gs)
其中keep_prob
以前被定义为
keep_prob = tf.placeholder(tf.float32, name='keep_prob')
我得到的摘要信息是计算出的keep_prob_val
,而不是我输入的some_val
。即使 - 正如预期的那样 - 如果我省略显式馈送keep_prob
,我会收到错误。
据我所知,这只发生在涉及keep_prob的摘要中。例如,当我
sess.run(accuracy, feed_dict={ ..., keep_prob: some_val})
我似乎得到了一个使用 some_val
计算accuracy
,这与相关的摘要相对应。
为什么我的keep_prob
的美联储值在我的摘要中被忽略了?
不依赖于keep_prob
占位符,而是取决于FLAGS.keep_prob
值:
keep_prob_val = tf.sub(1.0, tf.train.exponential_decay(
1 - FLAGS.keep_prob, global_step, FLAGS.decay_steps,
FLAGS.dropout_decay_rate, staircase=False))
keep_prob_summary = tf.scalar_summary('params/keep_prob', keep_prob_val)
因此,摘要将始终包含由 --keep_prob
标志(或其默认值)设置的(可能已衰减的)值。
要使摘要反映馈送值,您只需重新定义keep_prob_val
,keep_prob_summary
依赖于占位符:
keep_prob = tf.placeholder(tf.float32, name='keep_prob')
# ...
keep_prob_val = tf.sub(1.0, tf.train.exponential_decay(
1 - keep_prob, # N.B. Critical change goes here!
global_step, FLAGS.decay_steps, FLAGS.dropout_decay_rate, staircase=False))
keep_prob_summary = tf.scalar_summary('params/keep_prob', keep_prob_val)