我对以下代码段的运行方式感到有些困惑。
import tensorflow as tf
x = tf.Variable(0)
init_op = tf.initialize_all_variables()
modify_op = x.assign(5)
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(x))
x += 3
print(sess.run(x))
sess.run(init_op) # Trying to initialize x once again to 0
print(sess.run(x)) # Gives out 3, which leaves me confused.
print(sess.run(modify_op))
print(sess.run(x)) # Gives out 8, even more confusing
这是输出:
0
3
3
5
8
x += 3 行不是默认图形的一部分吗?或者其他事情正在发生?一些帮助将不胜感激,谢谢!
请您参考如下方法:
您的 x 变量正在被更改
x += 3
但不是以您可能期望的方式。 tensorflow 库代码覆盖了 +,这样你就可以有效地将内容 x 换成新的 TF 张量(旧的仍然会在图中,只是 x现在指向一个新的)。像这样写出来:
x = tf.Variable(0) + 3
而且更清楚发生了什么。另外,插入一些打印语句。 . .
x = tf.Variable(0)
print(x)
# <tensorflow.python.ops.variables.Variable object at 0x1018f5d68>
x += 3
print(x)
# Tensor("add:0", shape=(), dtype=int32)
如果 x 的内容对你很重要,那么如果你想跟踪/显示 x,请避免重新分配给 x 使用后面的变量名。或者,如果您没有方便的 Python 变量指向它,您始终可以命名张量并直接从图中获取它。重要的是习惯 TF 变量和 Python 变量之间的分离。
实际看到 TF 变量被赋值和重新设置,需要使用 TF 赋值运算符:
import tensorflow as tf
x = tf.Variable( 0 )
with tf.Session() as session:
session.run( tf.initialize_all_variables() )
print( x.eval() )
session.run( x.assign( x + 3 ) )
print( x.eval() )
session.run( tf.initialize_all_variables() )
print( x.eval() )
这个输出:
0
3
0
如你所料。
