我对如何让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图形可视化并未显示这些连接。
我看到占位符正确地连接到了图形的其他部分
我还看到了所有相应的计算值
但后者并未连接到前者。
这是预期的行为吗?有没有办法在TensorBoard图形的可视化中捕捉到计算值被用来填充相应占位符的事实?
如果没有办法将计算值连接到图形中,为什么还要显示它们呢?为什么其他计算值看起来正确连接了呢?例如,我的计算动量值,其定义方式与上述输入的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))
确实显示为连接到了它们影响的图形的所有部分。
回答:
我看到占位符正确地连接到了图形的其他部分,我还看到了所有相应的计算值,但后者并未连接到前者。
这是预期的行为吗?
这确实是正确的行为。你的图形被分解为两部分:
- 计算值
keep_prob_***_val
的部分 - 定义占位符
keep_prob_***
的部分
第一部分和第二部分在图形中没有连接。当你调用sess.run(keep_prob_***_val)
时,你创建了一个Python对象。这个对象随后被输入到图形的第二部分,但图形不知道它来自第一部分。
有没有办法在TensorBoard图形的可视化中捕捉到计算值被用来填充相应占位符的事实?
你可以使用tf.cond()
(文档)来选择使用图形第一部分计算的值,或测试值(如1.
用于keep_prob
):
is_train = tf.placeholder(tf.bool, [])def when_train(): return keep_prob_late_valdef when_not_train(): return 1.keep_prob_later = tf.cond(is_train, when_train, when_not_train)
为什么其他计算值看起来正确连接了呢?例如,我的计算动量值,其定义方式与上述输入的dropout值相同,确实显示为连接到了它们影响的图形的所有部分。
在这种情况下,你没有使用中间占位符,所以图形是完全连接的!