在Tensor中调整单值 - TensorFlow

时间:2016-01-08 20:58:52

标签: indexing addition tensorflow

我觉得这很尴尬,但你如何在张量中调整单个值?假设您要添加' 1'在你的张量中只有一个值?

通过索引来完成它并不起作用:

TypeError: 'Tensor' object does not support item assignment

一种方法是建立一个相同形状的0的张量。然后在您想要的位置调整1。然后你将两个张量加在一起。这又遇到了和以前一样的问题。

我已多次阅读API文档,似乎无法弄清楚如何执行此操作。提前致谢!

5 个答案:

答案 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.SparseTensordelta,代表更改:

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.assigntf.scatter_ndtf.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)