【问题标题】:Using tensordot to batch matrix multiplies使用 tensordot 批量矩阵乘法
【发布时间】:2021-11-20 06:35:14
【问题描述】:

如果我想计算矩阵-矩阵乘积a*b,我会做a@bnp.dot(a,b)

a = np.random.rand(2,2)
b = np.random.rand(*a.shape)
c = a@b
c.shape
>>> (2,2)

一般来说,我可以使用 tensordot 来做同样的事情:

c = np.tensordot(a,b,1)
c.shape
>>> 2,2

但是,如果我向 a 和 b 添加一个维度,我将不再得到我想要的结果(另一个 2,2,3 数组):

a = np.random.rand(2,2,3)
b = np.random.rand(*a.shape)
c = np.tensordot(a,b,1)
c.shape
>>> ValueError: shape-mismatch for sum

我尝试的任何轴排列,即使是可怕的b,axes=((0,1),(0,1)),都会导致输出形状不正确,或者由于无法完成计算而导致错误。

有没有办法完成我想做的事情?我的印象是使用 tensordot 会很简单,但似乎不是......

【问题讨论】:

  • tensordot 不适合批处理。使用matmul/@einsum
  • 关于如何 让这些功能完成我所追求的工作的任何指导?
  • 批次是哪个维度,dotted是哪个维度?
  • 假设我想要前两个维度(0 和 1)的矩阵-矩阵乘积,并且要保留任何其他暗淡。如果其他需要通过 reshape 折叠然后重新展开,没关系。
  • matmul docs 应该明确第一个(3 个)是批次。点规则适用于最后 2。einsum 更灵活。

标签: python numpy linear-algebra


【解决方案1】:

这给了我 (2, 2, 3) 输出。但请注意,我以前从未做过 3d 点积,所以请检查这些输出值是否正确:

output = np.matmul(a,b, axes=[(0, 1),(0, 1),(0, 1)])
print(output.shape)
(2, 2, 3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多