我可以获得计算的张量以连接到它们在我的 TensorBoard 图表中填充的占位符吗?

Can I get computed tensors to connect to the placeholders they fill in my TensorBoard graph?

我很困惑如何让我的 TensorBoard 图表可视化来捕捉我正在将计算值提供给我的一些占位符这一事实。

我已经定义了占位符

with tf.name_scope('params'):
    keep_prob_later = tf.placeholder(tf.float32, name='keep_prob_later')
    keep_prob_early = tf.placeholder(tf.float32, name='keep_prob_early')
    keep_prob_input = tf.placeholder(tf.float32, name='keep_prob_input')

以及用于计算其值的相应张量

with tf.name_scope('param_vals'):    
    with tf.name_scope('keep_prob_later_val'):
        keep_prob_later_val = tf.sub(1.0, tf.train.exponential_decay(1 - FLAGS.keep_prob_later, global_step,
                                                                     FLAGS.decay_steps,
                                                                     FLAGS.dropout_decay_rate, staircase=False))
    with tf.name_scope('keep_prob_early_val'):
        keep_prob_early_val = tf.sub(1.0, tf.train.exponential_decay(1 - FLAGS.keep_prob_early, global_step,
                                                                     FLAGS.decay_steps,
                                                                     FLAGS.dropout_decay_rate, staircase=False))
    with tf.name_scope('keep_prob_input_val'):
        keep_prob_input_val = tf.sub(1.0, tf.train.exponential_decay(1 - FLAGS.keep_prob_input, global_step,
                                                                     FLAGS.decay_steps,
                                                                     FLAGS.dropout_decay_rate, staircase=False))

然后我在训练我的模型时喂养它

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys,
                                keep_prob_later: sess.run(keep_prob_later_val),
                                keep_prob_early: sess.run(keep_prob_early_val),
                                keep_prob_input: sess.run(keep_prob_input_val)})

但我的 TensorBoard 图表可视化没有显示这些 "hooked up"。

我看到占位符正确连接到我的图表的其余部分

我也看到了所有相应的计算值

但后者与前者没有联系。

这是预期的行为吗?有没有办法在我的图表的 TensorBoard 可视化中捕获计算值用于填充相应占位符的事实?


如果无法将计算值与图表联系起来,为什么要显示它们?以及为什么其他计算值正确显示。例如,我计算的动量值,其定义就像上面的 fed dropout 值

with tf.name_scope('param_vals'):
    with tf.name_scope('momentum_val'):
        momentum_val = tf.sub(1.0, tf.train.exponential_decay(1 - FLAGS.initial_momentum, global_step,
                                                          FLAGS.decay_steps, FLAGS.momentum_decay_rate,
                                                          staircase=False))

确实显示出与它们影响的图表的所有部分相关联。

I see the placeholders connected correctly to the rest of my graph, and I see all of the corresponding computed values too, but the latter don't connect to the former.

Is this the expected be behavior?

确实这是正确的行为。您的图表分解为两部分:

  1. 计算值的部分keep_prob_***_val
  2. 定义占位符的部分keep_prob_***

第 1 部分和第 2 部分在图中没有连接。当您调用 sess.run(keep_prob_***_val) 时,您创建了一个 Python 对象。然后将该对象提供给图的第二部分,但图不知道它来自第一部分。


Is there a way to capture in the TensorBoard visualization of my graph the fact that the computed values are used to fill the corresponding placeholders?

您可以使用 tf.cond() (doc) 选择使用图表第一部分中计算的值,还是使用测试值(例如 1. for keep_prob):

is_train = tf.placeholder(tf.bool, [])

def when_train():
    return keep_prob_late_val

def when_not_train():
    return 1.

keep_prob_later = tf.cond(is_train, when_train, when_not_train)

And why other computed values appear correctly. For example, my computed momentum values, which are defined just like the above fed dropout values do show up connected to all the parts of the graph they influence.

在这种情况下,您不使用中间占位符,因此图是完全连接的!