'张量'对象没有属性' assign_add'

时间:2018-05-03 18:12:21

标签: object tensorflow attributes tensor

我遇到了错误' Tensor'对象没有属性' assign_add'当我尝试使用assign_add或assign_sub函数时。 代码如下所示:

我定义了两个张量t1和t2,具有相同的形状和相同的数据类型。

>>> t3 = tf.assign_add(t1,t2)
>>> t3
<tf.Tensor 'AssignAdd_4:0' shape=(2, 3, 4) dtype=int32_ref>

然后我在t1和t2上使用assign_add来创建t3

>>> t1[1]   
<tf.Tensor 'strided_slice_23:0' shape=(3, 4) dtype=int32>
>>> t2[1]
<tf.Tensor 'strided_slice_24:0' shape=(3, 4) dtype=int32>
>>> t4 = tf.assign_add(t1[1],t2[1])

然后我尝试使用t1 [1]和t2 [1]创建一个新的张量t4,它们是具有相同形状和相同数据类型的张量。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/admin/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/state_ops.py", line 245, in assign_add
return ref.assign_add(value)
AttributeError: 'Tensor' object has no attribute 'assign_add'

但有错误,

>>> t4 = tf.assign_sub(t1[1],t2[1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/admin/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/state_ops.py", line 217, in assign_sub
return ref.assign_sub(value)
AttributeError: 'Tensor' object has no attribute 'assign_sub'

使用assign_sub时出现相同的错误

{{1}}

知道哪里出错了? 感谢。

4 个答案:

答案 0 :(得分:0)

你在这里想做的事情有点令人困惑。我不认为你可以在同一时间/线上更新切片并创建一个新的张量。

如果您想在创建t4之前更新切片,请按照建议here使用tf.scatter_add()(或相应的tf.scatter_sub()tf.scatter_update())。例如:

sa = tf.scatter_add(t1, [1], t2[1:2])

然后,如果您想使用新的t4t1[1]获得新的张量t2[1],您可以这样做:

with tf.control_dependencies([sa]):
    t4 = tf.add(t1[1],t2[1])

答案 1 :(得分:0)

以下是使用tf.scatter_add和tf.scatter_sub的一些示例

>>> t1 = tf.Variable(tf.ones([2,3,4],tf.int32))
>>> t2 = tf.Variable(tf.zeros([2,3,4],tf.int32))
>>> init = tf.global_variables_initializer()
>>> sess.run(init)
>>> t1.eval()
array([[[1, 1, 1, 1],
    [1, 1, 1, 1],
    [1, 1, 1, 1]],

   [[1, 1, 1, 1],
    [1, 1, 1, 1],
    [1, 1, 1, 1]]], dtype=int32)
>>> t2.eval()
array([[[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]],

   [[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]]], dtype=int32)


>>> t3 = tf.scatter_add(t1,[0],[[[2,2,2,2],[2,2,2,2],[2,2,2,2]]])
>>> sess.run(t3)
array([[[3, 3, 3, 3],
    [3, 3, 3, 3],
    [3, 3, 3, 3]],

   [[1, 1, 1, 1],
    [1, 1, 1, 1],
    [1, 1, 1, 1]]], dtype=int32)

>>>t4 = tf.scatter_sub(t1,[0,0,0],[t1[1],t1[1],t1[1]])

以下是另一个例子,可以在https://blog.csdn.net/efforever/article/details/77073103

找到

因为在网上可以找到几个说明scatter_xxx的例子,所以我将其粘贴在下面作为参考。

import tensorflow as tf 
import numpy as np 


with tf.Session() as sess1:


c = tf.Variable([[1,2,0],[2,3,4]], dtype=tf.float32, name='biases') 
cc = tf.Variable([[1,2,0],[2,3,4]], dtype=tf.float32, name='biases1') 
ccc = tf.Variable([0,1], dtype=tf.int32, name='biases2') 

#对应label的centers-diff[0--]
centers = tf.scatter_sub(c,ccc,cc)
#centers = tf.scatter_sub(c,[0,1],cc)  
#centers = tf.scatter_sub(c,[0,1],[[1,2,0],[2,3,4]])
#centers = tf.scatter_sub(c,[0,0,0],[[1,2,0],[2,3,4],[1,1,1]])
#即c[0]-[1,2,0] \ c[0]-[2,3,4]\ c[0]-[1,1,1],updates要减完:indices与updates元素个数相同

a = tf.Variable(initial_value=[[0, 0, 0, 0],[0, 0, 0, 0]])  
b = tf.scatter_update(a, [0, 1], [[1, 1, 0, 0], [1, 0, 4, 0]])  
#b = tf.scatter_update(a, [0, 1,0], [[1, 1, 0, 0], [1, 0, 4, 0],[1, 1, 0, 1]]) 

init = tf.global_variables_initializer() 
sess1.run(init)

print(sess1.run(centers))
print(sess1.run(b))


[[ 0.  0.  0.]
 [ 0.  0.  0.]]
[[1 1 0 0]
 [1 0 4 0]]


[[-3. -4. -5.]
 [ 2.  3.  4.]]
[[1 1 0 1]
 [1 0 4 0]]

答案 2 :(得分:0)

您还可以使用tf.assign()作为解决方法,因为它实现了切片分配,与tf.assign_add()tf.assign_sub()不同,截至TensorFlow版本1.8。请注意,你只能进行一次切片操作(切片切片不起作用)而且这也不是原子的,所以如果有多个线程读写同一个变量,你就不知道哪个操作将是最后一个写入,除非您明确编写它。 tf.assign_add()tf.assign_sub()保证是线程安全的。不过,这更好,没有:考虑这段代码(测试过):

import tensorflow as tf

t1 = tf.Variable(tf.zeros([2,3,4],tf.int32))
t2 = tf.Variable(tf.ones([2,3,4],tf.int32))

assign_op = tf.assign( t1[ 1 ], t1[ 1 ] + t2[ 1 ] )

init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run( init_op )
    res = sess.run( assign_op )
    print( res )

将输出:

  

[[0 0 0 0]
    [0 0 0 0]
    [0 0 0 0]]

     

[[1 1 1 1]
    [1 1 1 1]
    [1 1 1 1]]]

根据需要。

答案 3 :(得分:0)

错误是因为t1是tf.Variable对象,而t1 [{1]是tf.Tensor。(您可以在打印语句的输出中看到它。)。tit和t2和t [[2]]

碰巧,tf.Tensor不能突变(只读),而tf.Variable可以(读取和写入) 参见here。 由于tf.scatter_add进行了就地加法,因此不适用于t1 [{1]和t2 [{1]]作为输入,而t1和t2作为输入则没有这种问题。