我觉得这很尴尬,但你如何在张量中调整单个值?假设您要添加' 1'在你的张量中只有一个值?
通过索引来完成它并不起作用:
TypeError: 'Tensor' object does not support item assignment
一种方法是建立一个相同形状的0的张量。然后在您想要的位置调整1。然后你将两个张量加在一起。这又遇到了和以前一样的问题。
我已多次阅读API文档,似乎无法弄清楚如何执行此操作。提前致谢!
答案 0 :(得分:65)
更新:TensorFlow 1.0包含tf.scatter_nd()
运算符,该运算符可用于在下方创建delta
而无需创建tf.SparseTensor
。
对于现有的操作,这实际上是非常棘手的!也许有人可以提出一个更好的方法来总结以下内容,但这是一种方法。
我们假设您有tf.constant()
张量:
c = tf.constant([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
...并且您想在位置[1,1]处添加1.0
。您可以这样做的一种方法是定义tf.SparseTensor
,delta
,代表更改:
indices = [[1, 1]] # A list of coordinates to update.
values = [1.0] # A list of values corresponding to the respective
# coordinate in indices.
shape = [3, 3] # The shape of the corresponding dense tensor, same as `c`.
delta = tf.SparseTensor(indices, values, shape)
然后,您可以使用tf.sparse_tensor_to_dense()
操作从delta
制作密集张量并将其添加到c
:
result = c + tf.sparse_tensor_to_dense(delta)
sess = tf.Session()
sess.run(result)
# ==> array([[ 0., 0., 0.],
# [ 0., 1., 0.],
# [ 0., 0., 0.]], dtype=float32)
答案 1 :(得分:8)
tf.scatter_update(ref, indices, updates)
或tf.scatter_add(ref, indices, updates)
怎么样?
ref[indices[...], :] = updates
ref[indices[...], :] += updates
请参阅this。
答案 2 :(得分:1)
tf.scatter_update
没有分配梯度下降算子,并且在至少学习tf.train.GradientDescentOptimizer
时会产生错误。您必须使用低级功能来实现位操作。
答案 3 :(得分:0)
我觉得tf.assign
,tf.scatter_nd
,tf.scatter_update
函数仅对tf.Variables
起作用的事实并没有引起足够的重视。就是这样。
在TensorFlow的更高版本(经1.14测试)中,您可以在tf.Variable
上使用索引来为特定索引分配值(同样,该方法仅适用于tf.Variable
对象)。
v = tf.Variable(tf.constant([[1,1],[2,3]]))
change_v = v[0,0].assign(4)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(change_v))
答案 4 :(得分:0)
如果要替换某些索引,我将创建一个布尔张量掩码和一个广播的张量,并在正确的位置使用新值。然后使用
new_tensor = tf.where(boolen_tensor_mask, new_values_tensor, old_values_tensor)