Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras和Pytorch的不同矩阵乘法行为_Python_Tensorflow_Keras_Pytorch_Linear Algebra - Fatal编程技术网

Python Keras和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

我试图理解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的大小匹配

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])