在 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.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()
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.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))
如果你想替换某些索引,我会创建一个布尔张量掩码和一个广播张量,并在正确的位置使用新值。然后使用
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)
不好意思问这个,请问如何调整张量内的单个值?假设您只想将“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.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()
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.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))
如果你想替换某些索引,我会创建一个布尔张量掩码和一个广播张量,并在正确的位置使用新值。然后使用
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)