我遇到了错误' 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}}
知道哪里出错了? 感谢。
答案 0 :(得分:0)
你在这里想做的事情有点令人困惑。我不认为你可以在同一时间/线上更新切片并创建一个新的张量。
如果您想在创建t4
之前更新切片,请按照建议here使用tf.scatter_add()
(或相应的tf.scatter_sub()
或tf.scatter_update()
)。例如:
sa = tf.scatter_add(t1, [1], t2[1:2])
然后,如果您想使用新的t4
和t1[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)