gpt4 book ai didi

python - 如何在 tensorflow 中用两个张量创建一个频率张量

转载 作者:行者123 更新时间:2023-12-04 01:32:11 26 4
gpt4 key购买 nike

我有一个像这样的张量,其中值是频率,行是索引(0 到 6):

tf_docs = 
[[0, 2],
[1, 2],
[2, 1],
[5, 0],
[0, 1],
[7, 8],
[9, 6]]

我有一个常量张量,其中张量的值是索引:

tf_topics = tf.constant([[1 2]
[1 3]
[1 0]
[2 3]
[2 0]
[3 0]
[3 4]
[3 2]
[3 1]
[4 2]
[4 1]
[2 1]], shape=(12, 2), dtype=int32)

我需要在 tf_docs 中按行检查这些索引,结果矩阵将是 tf_docs 中不为零的列数(在两者中索引)。

例如,我们在 tf_topics 中有 [1 2]。这意味着检查 tf_docs 中行索引 12 中的值。在 tf_docs 中,第一列和第二列的值都不为零。这就是为什么 [1 2] 的频率是 2

另一方面,[1,3] 得到 1 作为频率。因为索引 3 的第二列中的一个值为零。

所以结果将是这样的张量(这显然是对称的)。对角线将是每个 index 的频率之和:

[[2,   1, 1, 0, null],
[1, 3, 2, 1, 1 ],
[1, 2, 3, 1, 1 ],
[0, 1, 1, 5, 0 ],
[null,1, 1, 0, 1 ]]

到目前为止我做了什么:

我决定对这两个矩阵使用 tf.gathertf.count_nonzero。因为我想在 topics 中拆分 index 并查看这些 indexes 是否在 tf_docs/中共同出现p>

tf.math.count_nonzero(tf.gather(tf_docs, tf_topics, axis=0), axis=1)

不过,这似乎并没有给我想要的结果。

最佳答案

nonzero_tf_docs 定义为:

zero_tf_docs = tf.cast(tf.equal(tf_docs, tf.zeros_like(tf_docs)), tf.int32)
nonzero_tf_docs = 1 - tf.reduce_max(zero_tf_docs, axis=-1)

OP 要求为 tf_topics 中的每对索引 i, j 计算总和 nonzero_tf_docs[i] + nonzero_tf_docs[j] > 并将结果显示在矩阵中。这可以通过以下方式实现:

def compute_result(tf_topics_, nonzero_tf_docs, tf_docs):
# Find matrix lower part
values = tf.reduce_sum(tf.gather(nonzero_tf_docs, tf_topics_), axis=-1)
max_index = tf.reduce_max(tf_topics) + 1
out_sparse = tf.sparse.SparseTensor(indices=tf_topics_, values=values, dense_shape=[max_index, max_index])
out_sparse = tf.cast(out_sparse, dtype=tf.int32)
out_sparse = tf.sparse.reorder(out_sparse)
out_dense = tf.sparse.to_dense(out_sparse, default_value=-1)
out_lower = tf.matrix_band_part(out_dense, -1, 0)

# Compute diagonal
diag_values = tf.reduce_sum(tf_docs, axis=-1)
diag = tf.slice(diag_values,
begin=[0],
size=[max_index])

# Construct output matrix
out = out_lower + tf.transpose(out_lower)
mask = tf.eye(max_index, dtype=tf.int32)
out = (1 - mask) * out + mask * diag

return out


# Find docs without zeros
zero_tf_docs = tf.cast(tf.equal(tf_docs, tf.zeros_like(tf_docs)), tf.int32)
nonzero_tf_docs = 1 - tf.reduce_max(zero_tf_docs, axis=-1)

# Transform counts into matrix format
tf_topics = tf.cast(tf_topics, dtype=tf.int64)
tf_topics_reversed = tf.reverse(tf_topics, [-1])
tf_topics_ = tf_topics_reversed
out_1 = compute_result(tf_topics_, nonzero_tf_docs, tf_docs)
out_2 = compute_result(tf_topics, nonzero_tf_docs, tf_docs)
out = tf.maximum(out_1, out_2)

with tf.Session() as sess:
r = sess.run(out)
print(r) # prints [[ 2 1 1 0 -1]
# [ 1 3 2 1 1]
# [ 1 2 3 1 1]
# [ 0 1 1 5 0]
# [-1 1 1 0 1]]

关于python - 如何在 tensorflow 中用两个张量创建一个频率张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60711079/

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