Tensorflow高效的成对内积

3
在Tensorflow(Python)中,给定形状为(n x d)的矩阵X,其中每行是一个数据点,我想计算这些n个数据点的成对内积,即XX'的上三角。当然,我可以计算整个XX'并获取其上三角,但这意味着我会计算两次对角线元素。如何通过仅对每对计算一次内积在Tensorflow(Python)中高效地计算这些内容?

对不起 @greeness,我有点不理解。 X 可能不是一个平方数。你能给我看一些代码吗? - Sharpplus
我觉得我错了。我删除了之前的评论。在Python中,我不知道如何做到这一点。我也想看到答案。我没有查看内核源代码,但我怀疑由于tf.matmul接受一个输入参数transpose_b,它可能已经从BLAS库中具有内部优化。我的意思是高度可能已经考虑到了计算的节省。 - greeness
1个回答

0

使用numpy,您可以这样做:

import numpy as np

A = np.random.randn(5, 3)
inds = np.triu_indices(5) # upper triangle indices

# expensive way to do it
ipu1 = np.dot(A, A.T)[inds]


# possibly less expensive way to do it.
ipu2 = np.einsum('ij,ij->i', A[inds[0]], A[inds[1]])

print(np.allclose(ipu1, ipu2))

这将输出True。Tensorflow没有内置triu_indices函数,但是如果需要,可以通过查看numpy代码来编写一个。它确实有einsum。


OP 请求使用 TF 而非 Numpy 的解决方案。实施 triu_indices 会破坏避免对角线元素进行双重计算的目的,因为我们需要先计算整个 XX'。 - Vipin Pillai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接