这是一个简单的代码,可以将 4D 矩阵 a 乘以 3D 矩阵 b 进行“批量相乘”:
from functools import reduce
import numpy as np
from operator import mul
def einsum(a, b):
return np.einsum('ijkl,jkl->ikl', a, b)
def original(a, b):
s0, s1, s2, s3 = a.shape
c = np.empty((s0, s2, s3))
for j in range(s3):
for i in range(s2):
c[:, j, i] = np.dot(a[:, :, j, i], b[:, j, i])
return c
sz_a = (16, 4, 512, 512)
sz_b = (4, 512, 512)
a = np.random.random(reduce(mul, sz_a)).reshape(sz_a)
b = np.random.random(reduce(mul, sz_b)).reshape(sz_b)
对于时间:
%timeit original(a, b)
395 ms ± 2.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit einsum(a, b)
23.1 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
我想测试一下 tensordot 的性能以查看它的比较情况,但我真的很难在这里了解如何使用它。如果有人足够熟悉来指导我,将不胜感激。谢谢!
我最初的想法是:
np.tensordot(a, b, axes=((1),(0)))
但这给了我一个 MemoryError 所以我认为这是不对的......