PyTorch线性回归数据格式化报错解决:维度不匹配与张量问题
解决PyTorch线性回归中的尺寸不匹配与张量类型问题
先直接点出你遇到的两个核心问题:输入张量形状错误导致的尺寸不匹配,以及张量数据类型不统一引发的类型错误。我会一步步帮你修正代码,同时解释PyTorch处理输入的逻辑。
一、先解决最紧急的尺寸不匹配错误
你看到的RuntimeError: size mismatch, m1: [1 x 700], m2: [1 x 1],本质是输入张量的形状和线性层的预期完全不匹配:
nn.Linear(inp_sz=1, out_sz=1)期望的输入形状是 (样本数, 特征数),也就是700个样本每个对应1个特征,所以输入应该是[700, 1]- 但你用
x_train.view(1,-1)把张量改成了[1,700],相当于告诉模型"我有1个样本,这个样本有700个特征",和线性层的inp_sz=1矛盾,自然会报错。
修正步骤:
当你从Pandas的Series转成PyTorch Tensor时,默认是一维张量(比如[700]),需要把它重塑成二维的[700, 1],用view(-1, 1)即可(-1表示自动计算该维度的大小):
# 修正x_train和y_train的形状,同时用.values避免Pandas索引干扰 x_train = torch.Tensor(train['x'].values).view(-1, 1) y_train = torch.Tensor(train['y'].values).view(-1, 1) x_test = torch.Tensor(test['x'].values).view(-1, 1) y_test = torch.Tensor(test['y'].values).view(-1, 1)
二、解决张量类型不匹配问题
你提到的Expected object of type Variable[torch.DoubleTensor] but found type Variable[torch.FloatTensor],是因为PyTorch的模型参数默认是FloatTensor,但如果你的数据是DoubleTensor(Pandas读取的浮点数据默认是64位),就会出现类型不兼容。
两种统一类型的方法:
- 统一用FloatTensor(推荐,PyTorch默认):
显式指定数据类型为torch.float32:x_train = torch.tensor(train['x'].values, dtype=torch.float32).view(-1, 1) y_train = torch.tensor(train['y'].values, dtype=torch.float32).view(-1, 1) - 统一用DoubleTensor:
如果坚持用64位浮点,需要把模型也转成Double类型:model = Linear_Reg(input_sz, output_sz).double() x_train = torch.tensor(train['x'].values, dtype=torch.float64).view(-1, 1) y_train = torch.tensor(train['y'].values, dtype=torch.float64).view(-1, 1)
三、PyTorch是如何遍历输入数据的?
PyTorch的模型默认支持批量输入:
- 当你把形状为
[N, inp_sz]的张量喂给模型时,模型会自动对每个样本(每一行)进行计算,输出形状为[N, out_sz]的结果。 - 你当前的代码是把整个700个样本作为一个批次喂给模型,这在小数据集上没问题;如果是大数据集,通常会用
torch.utils.data.DataLoader来分批次加载数据,它会自动帮你处理批量的形状和遍历逻辑。
四、修正后的完整代码
import torch import torch.nn as nn import pandas as pd class Linear_Reg(nn.Module): def __init__(self, inp_sz, out_sz): super(Linear_Reg, self).__init__() self.linear = nn.Linear(inp_sz, out_sz) def forward(self, x): out = self.linear(x) return out # 读取数据 train = pd.read_csv('C:\\Users\\hgstr\\Jupyter_Files\\Data_Sets\\linear_regression\\train.csv') test = pd.read_csv('C:\\Users\\hgstr\\Jupyter_Files\\Data_Sets\\linear_regression\\test.csv') # 修正张量形状和类型 x_train = torch.tensor(train['x'].values, dtype=torch.float32).view(-1, 1) y_train = torch.tensor(train['y'].values, dtype=torch.float32).view(-1, 1) x_test = torch.tensor(test['x'].values, dtype=torch.float32).view(-1, 1) y_test = torch.tensor(test['y'].values, dtype=torch.float32).view(-1, 1) # 模型参数 input_sz = 1; output_sz = 1 epochs = 60 learning_rate = 0.001 model = Linear_Reg(input_sz, output_sz) crit = nn.MSELoss() opt = torch.optim.SGD(model.parameters(), learning_rate) # 训练循环 for e in range(epochs): opt.zero_grad() out = model(x_train) loss = crit(out, y_train) loss.backward() opt.step() # PyTorch 0.4+用loss.item()替代loss.data[0]更规范 print(f'epoch {e}, loss {loss.item()}')
额外小提示
- 如果你用的是PyTorch 0.4及以上版本,
Variable已经被整合进Tensor了,不需要再导入from torch.autograd import Variable。 - 学习率0.001对于线性回归来说可能偏慢,你可以尝试调到0.01或者0.1,加快收敛速度。
内容的提问来源于stack exchange,提问作者random_x_y_z
相关产品推荐
相关产品推荐

