PyTorch运行官方示例报错:addmm()参数需为Variable而非torch.FloatTensor
解决PyTorch 0.3.1.post2版本运行官方示例的兼容问题
看起来你踩了PyTorch版本迭代的API差异坑啦!你的问题完全是因为官方文档示例是基于PyTorch 0.4及以上版本编写的,但你用的是0.3.1.post2这个比较老的版本,两者的核心API有不少变化,我来给你拆解问题和解决方案:
第一个报错:RuntimeError: addmm(): argument 'mat1' must be Variable, not torch.FloatTensor
在PyTorch 0.3.x版本中,神经网络层(比如nn.Linear)只能接收Variable类型的数据输入——这是当时PyTorch实现自动微分的核心载体。而0.4+版本已经把Tensor和Variable合并了,直接用torch.randn()生成的普通Tensor就可以自动追踪梯度,不需要手动封装。
所以官方示例里直接用FloatTensor喂给模型,在你的老版本里就会触发类型不匹配的错误。
第二个报错:AttributeError: 'Variable' object has no attribute 'item'
同样是版本差异:item()方法是PyTorch 0.4才新增的,用来从单个元素的Tensor里取出Python数值。而在0.3.x版本中,Variable并没有这个方法,而且当时的普通Tensor也没有item(),要获取Variable中的损失值,你需要先拿到内部的Tensor(通过.data属性),再转成Python数值。
适配老版本的完整修改代码
把官方示例改成兼容0.3.1.post2的写法,只需要两处调整:
- 将输入输出张量封装成
Variable(注意要导入torch.autograd.Variable) - 把
loss.item()替换成老版本支持的取值方式,比如float(loss.data)或者loss.data[0]
修改后的可运行代码如下:
import torch from torch.autograd import Variable # 定义参数:批量大小、输入维度、隐藏层维度、输出维度 N, D_in, H, D_out = 64, 1000, 100, 10 # 创建输入输出张量并封装为Variable,y不需要追踪梯度 x = Variable(torch.randn(N, D_in)) y = Variable(torch.randn(N, D_out), requires_grad=False) # 构建两层神经网络模型 model = torch.nn.Sequential( torch.nn.Linear(D_in, H), torch.nn.ReLU(), torch.nn.Linear(H, D_out), ) # 定义损失函数:均方误差 loss_fn = torch.nn.MSELoss(size_average=False) learning_rate = 1e-4 for t in range(500): # 前向传播:得到预测值 y_pred = model(x) # 计算损失并打印,替换item()为老版本的取值方式 loss = loss_fn(y_pred, y) print(t, float(loss.data)) # 清零梯度 model.zero_grad() # 反向传播:计算梯度 loss.backward() # 梯度下降更新参数 for param in model.parameters(): param.data -= learning_rate * param.grad.data
额外小建议
如果你的环境允许,强烈建议升级到PyTorch 1.x及以上版本。新版本不仅简化了API(不用再手动处理Variable),还带来了更好的性能、更多的功能,官方文档的示例也都是基于新版本维护的,能避免很多这类版本兼容问题。
内容的提问来源于stack exchange,提问作者Monica Heddneck
相关产品推荐
相关产品推荐

