Python Keras和Pytorch的不同矩阵乘法行为
我试图理解DL框架中矩阵乘法是如何在二维上工作的,我偶然发现了一篇文章。 他用Keras来解释这一点,这对他很有用。 但是,当我尝试在Pytorch中复制相同的代码时,它失败了,错误出现在以下代码的输出中 Pytorch代码:Python Keras和Pytorch的不同矩阵乘法行为,python,tensorflow,keras,pytorch,linear-algebra,Python,Tensorflow,Keras,Pytorch,Linear Algebra,我试图理解DL框架中矩阵乘法是如何在二维上工作的,我偶然发现了一篇文章。 他用Keras来解释这一点,这对他很有用。 但是,当我尝试在Pytorch中复制相同的代码时,它失败了,错误出现在以下代码的输出中 Pytorch代码: a = torch.ones((2,3,4)) b = torch.ones((7,4,5)) c = torch.matmul(a,b) print(c.shape) 输出:RuntimeError:张量a(2)的大小必须与张量b(7)在非单态维度0的大小匹配 Ker
a = torch.ones((2,3,4))
b = torch.ones((7,4,5))
c = torch.matmul(a,b)
print(c.shape)
输出:RuntimeError:张量a(2)的大小必须与张量b(7)在非单态维度0的大小匹配
Keras代码:
a = K.ones((2,3,4))
b = K.ones((7,4,5))
c = K.dot(a,b)
print(c.shape)
输出:(2,3,7,5)
有人能解释一下我做错了什么吗?(又称矩阵点积)是一种定义良好的代数运算,它取两个二维矩阵。深度学习框架(例如,,)被调整为对批量矩阵进行操作,因此它们通常实现批量矩阵乘法,即对批量2D矩阵应用矩阵点积 您链接的示例显示了
matmul
如何处理一批矩阵:
a=tf.one((9,8,7,4,2))
b=tf.one((9,8,7,2,5))
c=tf.matmul(a,b)
请注意,除了最后两个维度外,所有维度都是相同的((9,8,7)
)
在您的示例中并非如此-前导(“批次”)维度不同,因此会出现错误
在pytorch中使用相同的引导尺寸:
a=torch.one((2,3,4))
b=火炬1((2,4,5))
c=火炬。matmul(a,b)
印刷品(c.shape)
结果与
如果您坚持使用具有不同批次维度的点积,则必须明确定义如何将两个张量相乘。您可以使用非常灵活的:
a=torch.one((2,3,4))
b=火炬1((7,4,5))
c=火炬.einsum('ijk,lkm->ijlm',a,b)
印刷品(c.shape)
导致:
这回答了你的问题吗?矩阵乘法是元素乘法。点积与矩阵乘法不同使用torch的自定义矩阵乘法规则。einsum()实际上给出了keras生成的形状。这是keras.dot的一种不理想的行为,还是有意这样做?@LostAtlas我写这条规则是为了符合你问题中的描述。就个人而言,我期望不同的输出形状:如果你有
a
-2个大小为3x4
的矩阵和b
-7个大小为4x5
的矩阵,我期望c
的输出是2x7
大小为3x5
的矩阵,也就是(2,7,3,5)
输出形状。我不知道凯拉斯是如何定义这一点的。
torch.Size([2, 3, 5])
torch.Size([2, 3, 7, 5])