让我们调用x_1和x_2这两个输入:
np.einsum('bijc,bijd->bcd', x_1, x_2)
bijc,bijd->bcd 归结为ijc,ijd->cd,因为没有使用第一个维度。想象一下,一方面你有c 频道ixj,另一方面有d 频道ixj。我们正在寻找的结果是一个cxb 矩阵。将来自x_1(总共有c)的每个ixj 层组合到来自x_2(总共有d)的每个ixj 层,总共得到c*d 值,这就是我们正在寻找。它实际上是两个ixj 层之间所谓的Hadamard product 的总和。
由于c 是第一个,c 将在第一个暗淡(行)中,而d 将是列数。
这是一个想法:
b_s, i_s, j_s, c_s = x_1.shape
d_s = x_2.shape[3]
y = np.zeros((b_s, c_s, d_s))
for b in range(b_s):
for i in range(i_s):
for j in range(j_s):
for c in range(c_s):
for d in range(d_s):
y[b, c, d] += x_1[b, i, j, c]*x_2[b, i, j, d]
这个post 可能会给你一个更好的主意
还可以尝试以下操作,看看在 i=2、j=2、c=1 和 d=1 的简单案例中会发生什么:
a = [[[1], [0]], [[0], [1]]]; b = [[[4], [1]], [[2], [2]]]
np.einsum('ijc,ijd->cd', a, b)
结果是一个大小为...1x1 的d*c 矩阵(因为c 和d 都等于1)。这里的结果是[6]