You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位),就会出现类型不兼容。

两种统一类型的方法:

  1. 统一用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)
    
  2. 统一用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:17