Python tensorflow(或numpy)中特定维度上的矩阵乘法

Python tensorflow(或numpy)中特定维度上的矩阵乘法,python,numpy,tensorflow,tensor,Python,Numpy,Tensorflow,Tensor,我希望我没有遗漏任何明显的信息,但我已经搜索了所有信息,但都没有结果,最后还是来这里询问…… 下面是我想做的一个非常简单的描述: 假设我有一个形状张量(20,40,3,5),还有另一个形状张量(20,40,5,7)。前两个维度的大小应保持不变,并有意使两个张量相同。另一方面,最后两个维度将(矩阵)相乘,matmulstyle。这意味着我得到的张量的形状是(20,40,3,7)。如何做到这一点?? 我意识到理论上我可以在前两个维度上循环并直接使用tf.matmul(),但这是绝对不可能的,因为运行

我希望我没有遗漏任何明显的信息,但我已经搜索了所有信息,但都没有结果,最后还是来这里询问……
下面是我想做的一个非常简单的描述:
假设我有一个形状张量
(20,40,3,5)
,还有另一个形状张量
(20,40,5,7)
。前两个维度的大小应保持不变,并有意使两个张量相同。另一方面,最后两个维度将(矩阵)相乘,
matmul
style。这意味着我得到的张量的形状是
(20,40,3,7)
。如何做到这一点??
我意识到理论上我可以在前两个维度上循环并直接使用
tf.matmul()
,但这是绝对不可能的,因为运行时、效率、model trainer和GPU全球范围内的抗议,以及我的良心(如果这有任何影响的话):-)

不幸的是,我忽略了以下选项:“不是我需要的”:
将给我一个shape
(20,40,3,20,40,7)
的输出。不好。
只有在我正确阅读的情况下才适用于第一维度(可能适用于RNN?无论如何不是我的情况)。
适用于秩>=2的张量,但在最后一个维度和第一个维度上分别适用于
@
。再说一次,不是我的情况

那么,这又是如何做到的呢?
一个
numpy
的答案可以帮助我找到正确的方向,这也会非常有帮助,但我需要在一天结束时实施
tf

提前谢谢,如果我错过了什么,我很抱歉


以下内容更接近我的需要,但不太清楚,因此需要单独编写:

前两个维度是图像的空间维度。最后两个实际上是平方矩阵,通过获得,并被相乘(连同其中一个上的适当转置)以获得与每个空间坐标相关联的协方差矩阵。我不知道这是否有任何帮助,但它至少提供了一些背景。此外,也可能存在或可能不存在批量维度,但我假设解决4-D张量情况将足够普遍化

发布此信息以备将来参考:
从numpy
matmul
doc:

如果任一参数为N-D,N>2,则将其视为矩阵堆栈 驻留在最后两个索引中,并相应地进行广播

对于维度
>2
它会将其视为矩阵堆栈,尝试
matmul
最后2个维度,并根据需要生成
np数组。
例如:

import numpy as np

A = np.ones((1,2,1,2))
B = np.ones((1,2,2,1))

print(A.shape)
print(B.shape)
print(np.matmul(A,B).shape)
结果:

(1, 2, 1, 2)
(1, 2, 2, 1)
(1, 2, 1, 1)

np.matmul
正是您所寻找的
np.matmul
将播放的内容,并为您提供正确的形状。但这似乎对你不起作用。有什么问题吗?如果我没有看错你的尺寸,numpy
matmul
应该可以工作
A@B
。这就是它设计用来处理的
矩阵堆栈。因此,
np.einsum('ijkl,ijlm->ijkm',A,B)
。但是我不知道tf有什么好处。你没事。我一直在忙着假设我的代码是正确的,并寻找解决方案,但你们让我看得更仔细了,似乎我做错了什么:-(这是为了说明一些事情!我不知道会发生什么,所以我将修复我的代码并继续。。。(我的一个张量上有一个额外的大小为1的冗余维度,ValueError指向其他维度,把我甩了)。所以我毕竟是哑巴。应该知道的。尽管如此,谢谢!