以下代码段的输出
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
保留了什么?
答案 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
提供一个值 - 即。添加的输出 - 因此计算该添加的操作将从图中删除而不执行。