gpt4 book ai didi

tensorflow - 如何用索引替换张量中的值?

转载 作者:行者123 更新时间:2023-12-01 06:03:12 25 4
gpt4 key购买 nike

下面的代码通过索引向张量内的特定位置添加一些内容(感谢@mrry 的回答 here)。

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)

例如,鉴于此 -
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.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 0.0]])

问题 - 是否可以替换特定位置的值而不是在该位置添加?如果在 tensorflow 中不可能,那么在任何其他类似的库中是否可能?

例如,

鉴于这种 -
[[4.0, 43.1.0, 45.0],
[2.0, 22.0, 6664.0],
[-4543.0, 0.0, 43.0]])

有没有办法将 [1, 1] 处的 22 替换为(比如说)45,从而得到以下结果?
[[4.0, 43.1.0, 45.0],
[2.0, 45.0, 6664.0],
[-4543.0, 0.0, 43.0]])

最佳答案

这很笨拙,但它确实替换了张量中的值。它基于 this answer你提到的。

# inputs
inputs = tf.placeholder(shape = [None, None], dtype = tf.float32) # tensor with values to replace
indices = tf.placeholder(shape = [None, 2], dtype = tf.int64) # coordinates to be updated
values = tf.placeholder(shape = [None], dtype = tf.float32) # values corresponding to respective coordinates in "indices"

# set elements in "indices" to 0's
maskValues = tf.tile([0.0], [tf.shape(indices)[0]]) # one 0 for each element in "indices"
mask = tf.SparseTensor(indices, maskValues, tf.shape(inputs, out_type = tf.int64))
maskedInput = tf.multiply(inputs, tf.sparse_tensor_to_dense(mask, default_value = 1.0)) # set values in coordinates in "indices" to 0's, leave everything else intact

# replace elements in "indices" with "values"
delta = tf.SparseTensor(indices, values, tf.shape(inputs, out_type = tf.int64))
outputs = tf.add(maskedInput, tf.sparse_tensor_to_dense(delta)) # add "values" to elements in "indices" (which are 0's so far)

它能做什么:
  • 将需要替换为 0 的位置的输入元素设置。
  • 将所需的值添加到这些 0(这是直接来自 here )。

  • 通过运行检查:
    with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    ins = np.array([[4.0, 43.0, 45.0], [2.0, 22.0, 6664.0], [-4543.0, 0.0, 43.0]])
    ind = [[1, 1]]
    vals = [45]
    outs = sess.run(outputs, feed_dict = { inputs: ins, indices: ind, values: vals })
    print(outs)

    输出:
    [[ 4.000e+00  4.300e+01  4.500e+01]
    [ 2.000e+00 4.500e+01 6.664e+03]
    [-4.543e+03 0.000e+00 4.300e+01]]

    不像很多 otherwise great answers在那里,这个可以超越 tf.Variable() s。

    关于tensorflow - 如何用索引替换张量中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42883415/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com