Adjust Single Value within Tensor -- TensorFlow
UPDATE: TensorFlow 1.0 includes a tf.scatter_nd()
operator, which can be used to create delta
below without creating a tf.SparseTensor
.
This is actually surprisingly tricky with the existing ops! Perhaps somebody can suggest a nicer way to wrap up the following, but here's one way to do it.
Let's say you have a tf.constant()
tensor:
c = tf.constant([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
...and you want to add 1.0
at location [1, 1]. One way you could do this is to define a tf.SparseTensor
, delta
, representing the change:
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)
Then you can use the tf.sparse_tensor_to_dense()
op to make a dense tensor from delta
and add it to 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)
How about tf.scatter_update(ref, indices, updates)
or tf.scatter_add(ref, indices, updates)
?
ref[indices[...], :] = updates
ref[indices[...], :] += updates
See this.