PyTorch矩阵乘法报错排查:线性回归中的维度与数据类型问题
搞定你的PyTorch线性回归问题:数据类型+维度错误修复
嘿,看你卡了3小时,肯定急坏了!咱们先把两个问题拆开来解决——一个是数据类型不匹配的RuntimeError,另一个是权重偏置的维度搞错了,一步步来:
1. 先解决数据类型不匹配的报错
你遇到的RuntimeError: Expected object of scalar type Double but got scalar type Float,原因很直白:
- 用numpy读进来的数据默认是**float64(Double)**类型,转成PyTorch张量后还是Double类型
- 但
torch.randn()生成的权重w和偏置b默认是**float32(Float)**类型 - PyTorch做矩阵乘法时要求参与运算的张量类型必须一致,所以直接触发了报错
有两种修复方式,更推荐第一种(符合PyTorch默认的高效计算习惯):
- 把输入张量转成float32:将
inputs = torch.from_numpy(data_input)改成inputs = torch.from_numpy(data_input).float() - 或者把权重偏置改成double类型:
w = torch.randn(..., dtype=torch.double, requires_grad=True),b同理
2. 再修正权重和偏置的维度错误
你的任务是用4个输入特征预测1科成绩(grade_one),线性回归的维度逻辑应该是这样的:
- 输入张量
inputs的形状是(样本数N, 特征数in_features)→ 也就是(395,4) - 权重
w的正确形状应该是(输出特征数out_features, 输入特征数in_features)→ 这里输出是1科成绩,所以是(1,4) - 偏置
b的形状应该是(输出特征数out_features,)→ 也就是(1,)
你原来的w=(395,4)转置后是(4,395),和inputs=(395,4)相乘会得到(395,395)的结果,这完全不是我们要的预测值,而且偏置b=(4)也没法和这个结果相加,维度肯定错了。
修改后的权重偏置定义:
w = torch.randn(1, 4, requires_grad=True) b = torch.randn(1, requires_grad=True)
这样inputs @ w.t()会得到(395,1)的结果,和b相加时PyTorch会自动广播b到(395,1),维度就完全匹配了。
完整修改后的代码
import torch import numpy as np from numpy import genfromtxt # 读取数据部分不变 data = np.genfromtxt('student-mat.csv', delimiter=',', dtype=float) data_input = data[1:, 0:4] output = data[1:, 4:7] # 修复1:把输入转成float32类型,保证和权重偏置类型一致 inputs = torch.from_numpy(data_input).float() outputs = torch.from_numpy(data[1:, 4:5]).float() # 输出也转成float32,后续计算Loss时类型不会冲突 # 修复2:修正权重和偏置的维度 w = torch.randn(1, 4, requires_grad=True) b = torch.randn(1, requires_grad=True) def model(x): return x @ w.t() + b preds = model(inputs) print(preds.shape) # 现在应该输出torch.Size([395, 1]),完全符合预期 print(preds)
额外小提示
如果之后要同时预测3科成绩(输出是(395,3)),只需要把权重改成(3,4),偏置改成(3,)就行:输入(395,4) × 权重转置(4,3) → (395,3),加偏置(3,)时会自动广播成(395,3),逻辑完全通用。
内容的提问来源于stack exchange,提问作者JWLBOYCE
相关产品推荐
相关产品推荐

