为什么我的付费TensorFlow占位符值会被计算值替换?

时间:2016-05-30 16:26:05

标签: logging machine-learning tensorflow

我已使用

定义了一些计算值和相关摘要
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})

我似乎使用accuracy计算some_val,这与相关摘要相对应。

为什么我的摘要中会忽略keep_prob的Feed值?

1 个答案:

答案 0 :(得分:1)

摘要不依赖于您的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_valkeep_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)