python - matmul和张量的通常乘法之间有什么区别吗
问题描述
我对使用 * 和 matmul 的两个张量之间的乘法感到困惑。下面是我的代码
import torch
torch.manual_seed(7)
features = torch.randn((2, 5))
weights = torch.randn_like(features)
在这里,我想将权重和特征相乘。所以,一种方法如下
print(torch.sum(features * weights))
输出:
tensor(-2.6123)
另一种方法是使用 matmul
print(torch.mm(features,weights.view((5,2))))
但是,这里的输出是
tensor([[ 2.8089, 4.6439],
[-2.3988, -1.9238]])
我在这里不明白的是matmul
,当两者相同时,为什么和通常的乘法会给出不同的输出。我在这里做错什么了吗?
编辑:当我使用形状(1,5)
的特征时,* 和matmul
输出都是相同的。但是,当形状为 时,它就不一样了(2,5)
。
解决方案
使用*
时,乘法是元素乘法,使用torch.mm
时是矩阵乘法。
例子:
a = torch.rand(2,5)
b = torch.rand(2,5)
result = a*b
result
将形状与a
或b
即在(2,5)
考虑操作时相同
result = torch.mm(a,b)
它会给出大小不匹配错误,因为这是正确的矩阵乘法(正如我们在线性代数中研究的那样)和a.shape[1] != b.shape[0]
. 当您应用视图操作时,torch.mm
您正在尝试匹配尺寸。
在某些特定维度的形状为 1 的特殊情况下,它变成点积,因此sum (a*b)
与mm(a, b.view(5,1))
推荐阅读
- regex - 用冒号替换每个奇怪的逗号 - 正则表达式
- python - 如何仅将某些参数传递给函数?
- php - 尝试在树莓派上使用 exec() 函数从 php 脚本在后台启动 php 脚本
- reactjs - 如何在useEffect钩子反应中停止内存泄漏
- javascript - Turbolinks、动态导入(file.js)、d3 重新加载
- .htaccess - 如何重定向301多域站点
- python - 如何从 oracle 查询输出中创建一个列表
- spring - 为什么 Spring 配置 bean 变成另一个类名以 $$EnhancerBySpringCGLIB 结尾的 bean
- node.js - 在新的不同文件中使用 log4js 写入日志?
- javascript - 在 OpenLayers 中删除图层