【问题标题】:how to multiply each row of a tensor to the rest of rows element wise in tensorflow如何在张量流中将张量的每一行乘以元素的其余行
【发布时间】:2023-03-28 03:30:01
【问题描述】:

我有一个这样的张量:

tf_docs = tf.constant([[0, 2, 1],
                       [1, 2, 2],
                       [2, 1, 3],
                       [5, 2, 2]], dtype=tf.int32)

我需要将每一行乘以其余行,元素明智,然后总结结果。

当第一行完成后,我们将处理第二行和其余行......

所以结果会是这样:它将是4*4,因为我们有 4 行

result_tf =[[0,  6,  5, 6 ],
            [6,  0, 10, 13],
            [5, 10,  3, 18],
            [6,  13, 18, 0]]

让我解释一下result_tf中的每个元素(矩阵是对称的。

第一行:

0*1 + 2*2 + 1*2 = 6
0*2 + 2*1 + 1*3 = 5
0*5 + 2*2 + 1*2 = 6

第二行:

1*2 + 2*1 + 2*3 = 10
1*5 + 2*2 + 2*2 = 13

第三行:

2*5 + 1*2 + 3*2 = 18

这些是我如何形成矩阵的上侧。

那么诊断中的值是:

(0,0) 在任何列中都没有co-occurred 所以0

(1,1) 在任何列中都没有co-occurred 所以0

(2,2) 在第二列有co-occurred 2 时间,在第三列有1 time 所以3

(3,3) 没有同时出现在任何列中,所以0

我觉得这需要更多的创造力来解决,而不是了解技术。 (从字面上看,如果您知道共现的概念,我正在计算同一矩阵上的共现)

我做了什么:

我可以使用 for 循环轻松做到这一点。但是我需要完成 tensorflow 操作。我找不到类似这个问题的任何东西。 我也在考虑使用 collect 每次都获取指定的行并将它们连接起来。但是这种方式不是动态的,我的行和列都比这大,所以这个解决方案不可行

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    这是一种方法:

    import tensorflow as tf
    
    tf_docs = tf.constant([[0, 2, 1],
                           [1, 2, 2],
                           [2, 1, 3],
                           [5, 2, 2]], dtype=tf.int32)
    
    # Non-diagonal elements
    nondiag = tf.matmul(tf_docs, tf_docs, transpose_b=True)
    # Compute diagonal
    r = tf.range(tf.shape(tf_docs, out_type=tf_docs.dtype)[0])
    # Compare each index against each value
    cmp = tf.equal(tf.expand_dims(tf_docs, axis=-1), r)
    # Count appearances of each index in each column
    count = tf.math.count_nonzero(cmp, axis=0, dtype=tf_docs.dtype)
    # Sum number of appearances over one
    diag = tf.reduce_sum(tf.maximum(count - 1, 0), axis=0)
    # Set diagonal elements
    result_tf = tf.linalg.set_diag(nondiag, diag)
    print(result_tf.numpy())
    # [[ 0  6  5  6]
    #  [ 6  0 10 13]
    #  [ 5 10  3 18]
    #  [ 6 13 18  0]]
    

    【讨论】:

    • 非常感谢您的帮助,您太棒了。您非常耐心并回答我的问题。我通常会查看答案,以便下次我能够自己解决。我还没有掌握tensorflow的技能。我了解您的解决方案(除了您如何提出cmp 部分)但是当出现新问题时我无法解决:|我认为这可能需要时间和更多的练习:),我几乎可以完成这个项目:)
    • @sariii 很高兴它有帮助。 cmp 张量是一个 3D 张量,如果 tf_docs[i, j]kFalse,则 cmp[i, j, k]True。这是一个全面的比较,效率不是很高,但希望它对你有用。我相信你每天都会在 TF 上变得更好,我很感激你把问题说得很清楚,这些对任何人来说都是困难的问题,无论是否有经验。不要犹豫,根据需要不断询问,这就是 SO 的意义所在。
    • 你介意看看我的问题吗,请stackoverflow.com/questions/60910269/…。有人已经回答了,答案是正确的,但形状不是。再次感谢:)
    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多