PyTorch中4×1矩阵与单元素变量相乘报错,求解决方案
解决PyTorch中Variable与numpy数组相乘的错误问题
嘿,我来帮你搞定这个问题!你遇到的错误主要有两个原因:类型不匹配和张量维度没对齐——你现在是直接拿PyTorch的Variable去和numpy数组相乘,这俩类型不兼容;另外初始的a形状是一维的(1,),和你的4×1数组相乘时,广播逻辑可能不会按你预期的执行。
具体解决方案
下面是修正后的代码,能完美实现你想要的效果:
import torch from torch.autograd import Variable import numpy as np # 第一步:把numpy数组转换成PyTorch张量,再包装成Variable x = np.transpose(np.array([[1, 2, 3, 4]])) # 转成float类型张量(和a的类型保持一致),再转成Variable x_var = Variable(torch.from_numpy(x).float()) # 定义可训练的Variable a = Variable(torch.rand(1), requires_grad=True) # 现在可以正常相乘了,PyTorch的广播机制会自动把a扩展到匹配x_var的形状 result = a * x_var print(result) # 验证a=2时的结果 a.data.fill_(2) print(a * x_var)
关键细节解释
- 类型统一:PyTorch的
Variable只能和同类型的张量/Variable运算,所以必须先把numpy数组x转换成PyTorch张量,再包装成Variable。 - 形状与广播:
a初始形状是(1,),x_var是(4,1),PyTorch的广播规则会自动把a扩展成(4,1)的形状,实现逐元素相乘,最终得到你想要的[[2],[4],[6],[8]]。如果想更明确控制形状,也可以用a = a.view(1,1)把a改成二维的,效果完全一样。
适配新版本PyTorch(0.4+)
如果你用的是较新的PyTorch版本,Variable已经被整合到张量中了,直接用带requires_grad=True的张量即可:
import torch import numpy as np x = np.transpose(np.array([[1, 2, 3, 4]])) x_tensor = torch.from_numpy(x).float() a = torch.rand(1, requires_grad=True) result = a * x_tensor print(result) # 设置a=2 a.data.fill_(2) print(a * x_tensor)
内容的提问来源于stack exchange,提问作者이승훈
相关产品推荐
相关产品推荐

