Python 如何在tensorflow中按元素将张量的每一行与其余行相乘
我有一个像这样的张量:Python 如何在tensorflow中按元素将张量的每一行与其余行相乘,python,tensorflow,Python,Tensorflow,我有一个像这样的张量: tf_docs = tf.constant([[0, 2, 1], [1, 2, 2], [2, 1, 3], [5, 2, 2]], dtype=tf.int32) 我需要将每一行乘以其余的行,按元素计算,然后将结果相加 当第一行完成时,我们将处理第二行和其他行,并且 结果是这样的:它将是4*4,因为我们有4行 result_tf
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]]
让我解释一下结果中的每个元素(矩阵是对称的)
第一行:
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
这就是我如何形成矩阵的上边
则diag中的值为:
(0,0)
在任何列中都没有同时出现
,因此0
(1,1)
在任何列中都没有同时发生
,因此0
(2,2)
在第二列中出现了2次co,在第三列中出现了1次so3
(3,3)
未同时出现在任何列中,因此0
我觉得这需要更多的创造力来解决,而不是了解技术。(如果你知道共现的概念,我在计算同一矩阵上的共现)
我所做的:
我可以使用for循环轻松地完成这项工作。但我需要使用tensorflow操作来完成。我找不到任何类似的问题。
我也在考虑每次使用“聚集”获取指定的行并对其进行聚集。但这种方法不是动态的,而且我的行和列都大于此值,因此此解决方案不可行。以下是一种方法:
将tensorflow导入为tf
tf_docs=tf.常数([[0,2,1],
[1, 2, 2],
[2, 1, 3],
[5,2,2]],dtype=tf.int32)
#非对角元素
nondiag=tf.matmul(tf_docs,tf_docs,transpose_b=True)
#计算对角线
r=tf.range(tf.shape(tf\u docs,out\u type=tf\u docs.dtype)[0])
#将每个索引与每个值进行比较
cmp=tf.equal(tf.expand_dims(tf_docs,轴=-1),r)
#计算每列中每个索引的出现次数
count=tf.math.count\u非零(cmp,axis=0,dtype=tf\u docs.dtype)
#一次以上的总出现次数
diag=tf.减少总和(tf.最大值(计数-1,0),轴=0)
#设置对角元素
结果=tf.linalg.set诊断(非诊断,诊断)
打印(结果\u tf.numpy())
# [[ 0 6 5 6]
# [ 6 0 10 13]
# [ 5 10 3 18]
# [ 6 13 18 0]]
非常感谢您的帮助,您真是太棒了。非常感谢您耐心地回答我的问题。我通常会复习答案,以便下次能够自己解决问题。我仍然没有掌握tensorflow的技能。我理解您的解决方案(除了您如何提出cmp
部分)但当出现新问题时,我无法解决:|我认为这可能需要时间和更多的练习:),我几乎就要完成这个项目了:)@sarii很高兴它有帮助。cmp
张量是一个三维张量,使得cmp[i,j,k]
为True
如果tfu-docs[i,j]
为k
则为False
。这是一个全面的比较,这不是超级有效的,但希望它可以为你工作。我相信你每天都会在TF的帮助下变得更好,我感谢你的努力,让问题变得非常清楚,这些问题对于任何人来说都是困难的,无论是否有经验。如果需要,请不要犹豫,继续问下去,这就是问题的关键。你介意看看我的问题吗。有人已经回答了,答案有点正确,但形状不正确。再次感谢:)