更新占位符后出现意外行为

时间:2017-02-01 16:33:27

标签: tensorflow

以下代码段的输出

ph = tf.placeholder(tf.int32)
ph += 1000
a = ph + 0
init = tf.initialize_all_variables()
sess.run(init)
print(sess.run([a], {ph: 5}))

[5],而不是我预期的[1005]

我已经回答说ph+=1000行覆盖了原来的占位符,所以我没有喂我认为我正在喂食的东西。

但是,我并没有完全理解这个答案。如果ph是变量,那么输出当然是[1005]。那我在喂什么?更新操作后ph保留了什么?

1 个答案:

答案 0 :(得分:2)

我认为混淆源于TensorFlow变量和Python变量之间的差异。

在TensorFlow中,tf.placeholder() op不保持状态,并且没有支持“更新”它的概念:将其视为其他语言中函数的形式参数(例如x in Python中的def f(x): ...)。但是,您可以将tf.placeholder()分配给 Python 变量,以便在程序的其他位置使用它。

当您编写ph += 1000时,您正在创建一个新的张量,其值大于ph(它是ph = ph + 1000的简写),然后将其分配给 Python 变量ph。编写程序的等效方法是:

ph = tf.placeholder(tf.int32)
new_ph = ph + 1000
a = new_ph + 0
print(sess.run([a], {new_ph: 5}))

请注意,您实际上正在为张量new_ph提供一个值 - 即。添加的输出 - 因此计算该添加的操作将从图中删除而不执行。