python - 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)
有人可以解释我做错了什么吗?
解决方案
矩阵乘法(又名矩阵点积)是一个定义明确的代数运算,采用两个二维矩阵。
深度学习框架(例如tensorflow、keras、pytorch)被调整为批量处理矩阵,因此它们通常实现批量矩阵乘法,即将矩阵点积应用于一批二维矩阵。
您链接的示例显示了如何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])
推荐阅读
- tensorflow - Keras / TensorFlow:将常数层连接到卷积
- qt - Qt Installer Framework:基于是否选择安装组件的条件操作
- hyperledger-explorer - 在超级账本资源管理器数据库中插入事务时出错
- r - R dplyr 计算2组内的第一个差异
- javascript - Youtube 视频嵌入不适用于 Android 上的原生反应
- reactjs - 使用 formik、yup 和 axios 去抖动
- git - 获取推送更改的更改分支的名称,Jenkins 管道脚本
- r - 使用 rvest 添加新字段以形成表单
- javascript - 在 ASP.NET 中获取 JavaScript 或 jQuery 中的 RadNumericTextBox 的值
- python - 大熊猫忽略 NaN 的成对欧几里得距离