在 Tensor 中调整单个值 -- TensorFlow

Adjust Single Value within Tensor -- TensorFlow

不好意思问这个,请问如何调整张量内的单个值?假设您只想将“1”加到张量中的一个值?

通过索引来做是行不通的:

TypeError: 'Tensor' object does not support item assignment

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

我已经通读了 API 文档好几遍,但似乎无法弄清楚如何执行此操作。提前致谢!

更新: 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() op 从 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)

tf.scatter_update(ref, indices, updates)tf.scatter_add(ref, indices, updates) 怎么样?

ref[indices[...], :] = updates
ref[indices[...], :] += updates

参见this

tf.scatter_update 没有分配梯度下降运算符,并且在至少使用 tf.train.GradientDescentOptimizer 进行学习时会产生错误。您必须使用低级函数实现位操作。

我觉得 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))

如果你想替换某些索引,我会创建一个布尔张量掩码和一个广播张量,并在正确的位置使用新值。然后使用

new_tensor = tf.where(boolen_tensor_mask, new_values_tensor, old_values_tensor)

如果你想将 1 添加到你的张量 v 的元素 [2,0](例如)(确保你的张量是可变的),只需写:

v[2,0].assign(v[2,0]+1)