首页 > 解决方案 > Keras 和 Pytorch 之间的不同矩阵乘法行为

问题描述

我试图了解矩阵乘法如何在 DL 框架中的二维上工作,我偶然发现了一篇文章here。他用 Keras 来解释同样的事情,这对他有用。但是当我尝试在 Pytorch 中重现相同的代码时,它会失败并出现以下代码输出中的错误

火炬代码:

a = torch.ones((2,3,4))
b = torch.ones((7,4,5))
c = torch.matmul(a,b)
print(c.shape)

输出:RuntimeError:张量 a (2) 的大小必须与非单维 0 处的张量 b (7) 的大小相匹配

凯拉斯代码:

a = K.ones((2,3,4))
b = K.ones((7,4,5))
c = K.dot(a,b)
print(c.shape)

输出:(2, 3, 7, 5)

有人可以解释我做错了什么吗?

标签: pythontensorflowkeraspytorchlinear-algebra

解决方案


矩阵乘法(又名矩阵点积)是一个定义明确的代数运算,采用两个二维矩阵。
深度学习框架(例如)被调整为批量处理矩阵,因此它们通常实现批量矩阵乘法,即将矩阵点积应用于一批二维矩阵。

您链接的示例显示了如何matmul处理一批矩阵:

a = tf.ones((9, 8, 7, 4, 2))
b = tf.ones((9, 8, 7, 2, 5))
c = tf.matmul(a, b)

注意除了最后两个维度之外的所有维度都是相同( (9, 8, 7))。

在您的示例中并非如此 - 前导(“批次”)尺寸不同,因此出现错误。

在 pytorch 中使用相同的前导尺寸:

a = torch.ones((2,3,4))
b = torch.ones((2,4,5))
c = torch.matmul(a,b)
print(c.shape)

结果与

torch.Size([2, 3, 5])

如果您坚持使用不同批次尺寸的点积,则必须明确定义如何将两个张量相乘。您可以使用非常灵活的方法来做到这一点torch.einsum

a = torch.ones((2,3,4))
b = torch.ones((7,4,5))
c = torch.einsum('ijk,lkm->ijlm', a, b)
print(c.shape)

结果:

torch.Size([2, 3, 7, 5])

推荐阅读