Tensorflow:tf.identity 和'='运算符有什么区别

Tensorflow: what is the difference between tf.identity and '=' operator

我对 '=' 运算符感到困惑,而 tf.identity(),我认为 '=' 只是对张量进行引用,而 identity 是进行复制,例如,

ref = x
ref = ref*0
sess.run(x)

我将 x 全部设置为 0 元素,并且

copy = tf.identity(x)
copy = ref*0
sess.run(x)

x不会变,因为identity make copy,不是reference,但是通过实验,'='也做copy并且x没有设置为0,所以有什么不同?

不同之处仅在于 tensorlfow 图形布局。 tf.identity 在图中创建一个模仿其参数的 new op,而纯赋值添加一个 new python 变量指向相同的操作。

在这两种情况下(refx 对或 copyx 对),两个操作的计算结果始终相同。但在第二种情况下,tf.get_default_graph().get_operations() 将在列表中显示一个名为 Identity.

的新操作
sess = tf.InteractiveSession()
x = tf.Variable(1.0)
sess.run(x.initializer)

ref = x
copy = tf.identity(x)
print(x.eval(), copy.eval(), ref.eval())  # 1.0 1.0 1.0

sess.run(x.assign(2.0))
print(x.eval(), copy.eval(), ref.eval())  # 2.0 2.0 2.0

print(tf.get_default_graph().get_operations())

您可能想知道,既然可以简单地分配任务,为什么有人要引入新操作。有些情况下赋值不起作用,但 tf.identity 起作用,正是因为它创建了一个新的操作,例如在控制流中。看到这个问题:.

已接受的答案似乎不再正确,至少在急切执行时是这样。 tf.identity 将 return 具有相同值的不同张量,因此它等价于 <variable>.read_value()。这是文档中的示例,显示了当前行为:

a = tf.Variable(5)
a_identity = tf.identity(a)
a.assign_add(1)

a.numpy() # 6 

a_identity.numpy() # 5

因此,我们看到在 tf.identity 编辑的张量上执行的操作不会影响调用它的张量。