Python TensorFlow:多次初始化变量

Python TensorFlow:多次初始化变量,python,tensorflow,Python,Tensorflow,下面的代码段是如何运行的,我有点困惑 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(ini

下面的代码段是如何运行的,我有点困惑

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)
这将产生:

0
3
0

正如您所期待的。

从外观上看,这是因为您将x=x+3线添加到了图形中。更清楚地说:现在,您定义的旧x的名称为variable_0或类似的名称,而您打印的新张量现在不再是variable_0,而是variable_1=variable_0+3。它解释了为什么你得到3(0+3)和8(5+3)。变量0仍然存在于某个地方,如果您打印sess.run(graph.get_tensor_by_name(“变量0”)),它不会改变。您将得到您期望的结果。要了解变量的名称,只需将图形视为图形定义。谢谢@jean,这对我很有帮助。谢谢,这就把它清除了。因此,我应该坚持使用
tf.add
tf.assign
tf.assign\u add
系列,以便将更改反映在图表中。@stark:您不必这样做,这不会把您保存在这里。如果以后要使用变量名跟踪/显示
x
,应避免重新分配给
x
。或者,如果没有方便的Python变量指向张量,则始终可以命名张量并直接从图中获取它。重要的是要习惯TF变量和Python变量之间的分离。我刚刚意识到这一点。我会再多玩一会儿,谢谢你的提示@斯塔克:我在答案中添加了更多的代码,显示调用
初始化所有变量()
重新设置
x
,就像您之前尝试测试的那样。请注意我是如何使用tf操作将赋值给
x
。这就是我所做的,在您指出python变量和TF托管变量在图中是不同的之后。谢谢你的详细解释。
0
3
0