【问题标题】:multiplying a vector (1 x N) by a tensor (N x M x M)将向量 (1 x N) 乘以张量 (N x M x M)
【发布时间】:2020-11-18 16:24:54
【问题描述】:

我正在寻找 numpy 中的矩阵运算,或者最好是 pytorch 中的矩阵运算,它允许将向量 (1 x N) 乘以张量 (N x M x M) 并得到 (1 x M x M)。这可以使用 for 循环轻松完成,但 for 循环不允许在训练期间进行反向传播。我尝试在 numpy 和 pytorch(以及其他几个,如 dot 和 bmm)中使用 matmul,但无法正常工作。这是我正在尝试做的一个示例(其中 M=2,但在我的用例中为 256):

a = np.array([1,2,3])
b = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]]])

我想执行操作:1*[[1,2],[3,4]] + 2*[[5,6],[7,8]] + 3*[[9,10],[11,12]],可以通过这样的 for 循环来实现:

for i in range(3):
  matrix_sum += a[i]*b[i]

任何建议或解决方案将不胜感激。

【问题讨论】:

  • A@B的规则是A的最后一个dim和B的倒数第二个。N就是这个维度,所以B需要改成(M,N ,M)

标签: python arrays numpy pytorch matrix-multiplication


【解决方案1】:

Numpy 和 pytorch 是基于矩阵乘法构建的!

手电筒示例:

A = torch.rand(1, N)
B = torch.rand(N, M, M)

C = A @ B.transpose(0, 1) 
C.transpose_(0, 1)
C.shape
torch.size(1, M, M)

对于 numpy 也是如此:

A = np.random.randn(1, N)
B = np.random.randn(N, M, M)

C = A @ B.transpose(1, 0, 2)
C = C.transpose(1, 0, 2)
C.shape
(1, M, M)

编辑对于 Einsum 爱好者:

Pytorch 和 numpy 处理 einsum 的方式几乎相同:

torch.einsum('i,ijk->jk', A, B)
np.einsum('i,ijk->jk', A, B)

Pytorch einsum 文档:https://pytorch.org/docs/master/generated/torch.einsum.html Numpy einsum 文档:https://numpy.org/doc/stable/reference/generated/numpy.einsum.html

【讨论】:

  • 我编辑了你的错字,但你把它改了:D 不应该是 transpose 而不是 transopose
【解决方案2】:

你可以使用简单的einsum:

#this gives you 2-D array (M,M)
np.einsum('i,ijk->jk',a,b)

输出:

[[38 44]
 [50 56]]

或其他解决方案:

#this gives you 3-D array (1,M,M)
a[None,:]@b.swapaxes(0,1)

输出:

[[[38 44]
  [50 56]]]

【讨论】:

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