gpt4 book ai didi

tensorflow - 如何使用 tf.scatter_nd "without"累加?

转载 作者:行者123 更新时间:2023-12-02 09:19:09 27 4
gpt4 key购买 nike

假设我有一个 (None, 2)-shape 张量 indices 和 (None,)-shape 张量 values。这些实际行号和值将在运行时确定。

我想设置一个 4x5 张量 t,索引的每个元素都有值的值。我发现我可以像这样使用 tf.scatter_nd:

t = tf.scatter_np(indices, values, [4, 5])
# E.g., indices = [[1,2],[2,3]], values = [100, 200]
# t[1,2] <-- 100; t[2,3] <-- 200

我的问题是:当索引有重复时,值将被累加。

# E.g., indices = [[1,2],[1,2]], values = [100, 200]  
# t[1,2] <-- 300

我只想分配一个,即无知(因此,第一个值)或覆盖(因此,最后一个值)。

我觉得我需要检查索引中的重复项,或者我需要使用 tensorflow 循环。有人可以建议吗? (希望是一个最小的示例代码?)

最佳答案

您可以使用 tf.unique:唯一的问题是此操作需要一维张量。因此,为了克服这个问题,我决定使用 Cantor pairing function .简而言之,它存在一个将元组(在本例中是一对值,但它适用于任何 N 维元组)映射到单个值的双射函数。

一旦坐标被简化为标量的一维张量,则 tf.unique 可用于查找唯一数字的索引。

Cantor 配对函数是可逆的,因此现在我们不仅知道一维张量内非重复值的索引,而且我们还可以回到坐标的二维空间并使用 scatter_nd 在没有累加器问题的情况下执行更新。

长话短说:

import tensorflow as tf
import numpy as np

# Dummy values
indices = np.array([[1, 2], [2, 3]])
values = np.array([100, 200])

# Placeholders
indices_ = tf.placeholder(tf.int32, shape=(2, 2))
values_ = tf.placeholder(tf.float32, shape=(2))

# Use the Cantor tuple to create a one-to-one correspondence between the coordinates
# and a single value
x = tf.cast(indices_[:, 0], tf.float32)
y = tf.cast(indices_[:, 1], tf.float32)
z = (x + y) * (x + y + 1) / 2 + y # shape = (2)

# Collect unique indices, treated as single values
# Drop the indices position into z because are useless
unique_cantor, _ = tf.unique(z)

# Go back from cantor numbers to pairs of values
w = tf.floor((tf.sqrt(8 * unique_cantor + 1) - 1) / 2)
t = (tf.pow(w, 2) + w) / 2
y = z - t
x = w - y

# Recreate a batch of coordinates that are uniques
unique_indices = tf.cast(tf.stack([x, y], axis=1), tf.int32)

# Update without accumulator
go = tf.scatter_nd(unique_indices, values_, [4, 5])

with tf.Session() as sess:
print(sess.run(go, feed_dict={indices_: indices, values_: values}))

关于tensorflow - 如何使用 tf.scatter_nd "without"累加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44117430/

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