首页 > 解决方案 > Tensorflow 中 v.assign(v + 1) 和 v = v + 1 的区别

问题描述

以下 TensorFlow 代码可以正常工作并v1变为 [1., 1., 1.]

v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
v1 = v1 + 1 

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print (v1.eval())

下面的代码段也给了我们与上面完全相同的结果。v1变成 [1., 1., 1.] 如果我们运行sess.run(inc_v1).

v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
inc_v1 = v1.assign(v1 + 1)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(inc_v1)
    print (v1.eval())

但是,以下代码会导致错误。

v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
v1 = v1 + 1 
inc_v1 = v1.assign(v1 + 1)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(inc_v1)
    print (v1.eval())

错误如下:

AttributeError: 'Tensor' object has no attribute 'assign'

你能告诉我为什么它会导致错误吗?

标签: tensorflowassignarithmetic-expressions

解决方案


张量和变量是 TensorFlow 中的不同对象

import tensorflow as tf


def inspect(t):
    print('\n %s\n-------' % t.name)
    print(type(t))
    print(t.op.outputs)
    print('has assign method' if 'assign' in dir(t) else 'has no assign method')


v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
inspect(v1)
v2 = v1 + 1
inspect(v2)

 v1:0
-------
<class 'tensorflow.python.ops.variables.Variable'>
[<tf.Tensor 'v1:0' shape=(3,) dtype=float32_ref>]
has assign method

 add:0
-------
<class 'tensorflow.python.framework.ops.Tensor'>
[<tf.Tensor 'add:0' shape=(3,) dtype=float32>]
has no assign method

因此,v1:0实际上是变量本身并v1具有方法assign。这是有道理的,因为它只是对浮点值的引用。另一方面,v2 = v1 + 1结果是add操作的输出。所以v2is 不再是一个变量,你不能给v2. add在这种情况下,您希望更新哪个操作数?每当您使用时,请v1考虑使用的read_value()操作v1

v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
inspect(v1)
w = v1.read_value()
inspect(w)
v2 = v1.read_value() + 1
inspect(v2)

 v1:0
-------
<class 'tensorflow.python.ops.variables.Variable'>
[<tf.Tensor 'v1:0' shape=(3,) dtype=float32_ref>]
has assign method

 read:0
-------
<class 'tensorflow.python.framework.ops.Tensor'>
[<tf.Tensor 'read:0' shape=(3,) dtype=float32>]
has no assign method

 add:0
-------
<class 'tensorflow.python.framework.ops.Tensor'>
[<tf.Tensor 'add:0' shape=(3,) dtype=float32>]
has no assign method

推荐阅读