使用assign_add/assign_sub时遇'Tensor'对象无assign_add属性错误求助
解决 TensorFlow 中 'Tensor' object has no attribute 'assign_add' 的问题
为什么会出现这个报错?
你虽然一开始把t1和t2定义成了tf.Variable,但如果在调用assign_add之前,对t1做了重新赋值类的操作(比如t1 = t1 + t2或者t1 = tf.some_operation(t1)),这时候t1会被自动转换成普通的tf.Tensor——而Tensor是不可变的,根本没有assign_add这类原地更新的方法,自然就会抛出这个错误。
举个典型的错误场景:
import tensorflow as tf t1 = tf.Variable(tf.ones([2,3,4], tf.int32)) t2 = tf.Variable(tf.zeros([2,3,4], tf.int32)) # 这个操作会把t1从Variable转成普通Tensor t1 = t1 + 1 # 此时调用assign_add必然报错 t1.assign_add(t2)
正确的解决方式
要使用assign_add/assign_sub,核心是保证调用对象始终是tf.Variable,直接调用它的原地更新方法即可:
方法1:直接用Variable的assign_add原地更新
这是最推荐的方式,不会改变变量的类型,直接在原Variable上更新值:
import tensorflow as tf t1 = tf.Variable(tf.ones([2,3,4], tf.int32)) t2 = tf.Variable(tf.zeros([2,3,4], tf.int32)) # 直接调用Variable的assign_add方法,原地更新t1 t1.assign_add(t2) # 查看更新后的结果 print(t1.numpy())
方法2:如果不小心转成了Tensor,重新包装为Variable(仅应急用)
如果你已经把Variable转成了Tensor,又想继续用assign_add,可以把它重新包装成Variable,但这会创建新的变量对象,除非必要不建议这么做:
# 假设此时t1已经是Tensor t1 = tf.Variable(t1) # 现在可以正常调用assign_add了 t1.assign_add(t2)
额外提醒
tf.Variable是可变状态容器,专门支持assign_add/assign_sub/assign这类原地更新操作;而普通tf.Tensor是不可变的,所有操作都会返回新的Tensor对象。- 在TensorFlow 2.x中,不需要手动开启会话,直接调用Variable的方法就能完成状态更新。
内容的提问来源于stack exchange,提问作者X. L
相关产品推荐
相关产品推荐

