我正在尝试对一些张量执行以下操作。目前我正在使用 einsum,我想知道是否有一种方法(也许使用 dot 或 tensordot)可以让事情变得更快,因为我觉得我正在做的或多或少是一些外部和内部产品。
res1 = numpy.einsum('ij, kjh->ikjh', A, B)
res2 = np.einsum('ijk, jk->ij', C, D)
我尝试过使用tensordot和dot,由于某种原因,我无法找到设置轴的正确方法......
np.einsum
对于复杂问题已经很有效了。为了优化它,您可以使用纯 Python 循环或 NumPy 向量化函数进行向量化。或者,optimal='best'
尝试选择最佳的收缩算法,但它可能有点挑剔。请务必对其进行验证,以确保它为您提供最佳性能。
如果您打算使用其他方法,
np.tensordot
非常适合涉及收缩的操作(通过在指定轴上求和来减少维度)。与 einsum
相比,它可以更好地控制轴规格。您可以将其与 result = np.tensordot(A, B, axes=([axis1, axis2], [axis3, axis4]))
一起使用
或者,如果您的
einsum
运算涉及不带收缩的矩阵乘法(跨特定轴的元素求和),则 np.matmul
可以作为替代方案。您可以将其与 result = np.matmul(A, B)
一起使用
您还可以尝试使用
SciPy
、TensorFlow
、PyTorch
。