You need to enable JavaScript to run this app. PyTorch构造TensorDataset报AssertionError张量尺寸不匹配问题求助
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch构造TensorDataset报AssertionError张量尺寸不匹配问题求助

问题根因

你遇到的AssertionError: Size mismatch between tensors报错,本质是构造TensorDataset时传入的训练特征张量和训练标签张量的样本数量不匹配,触发了PyTorch源码里的长度校验逻辑。

代码错误点梳理

  • 标签生成逻辑完全错误:train_data.status_group == "functional needs repair"仅做了条件判断,没有赋值给任何变量,后续生成train_labels时用到的train_data_new是未定义变量,直接导致标签张量的长度和特征张量不匹配
  • 神经网络前向传播逻辑错误:定义了fc1全连接层和relu激活函数,但forward方法里直接将输入传入输出层,未使用已定义的隐藏层
  • 训练循环变量未定义:循环中用到的lrmse变量没有提前定义,运行到这里会直接报错
  • 损失函数缩进错误:loss = nn.BCELoss()写在了Net类的内部作用域,属于逻辑错误

修复后的可运行代码

import numpy as np
import pandas as pd
import torch
from torch import nn

train_link = "/content/pump-data/train_pumps.csv"
test_link = "/content/pump-data/test_pumps.csv"

train_data = pd.read_csv(train_link)
test_data = pd.read_csv(test_link)

# 修正标签生成逻辑:将status_group转为二分类标签
train_data['label'] = (train_data.status_group == "functional needs repair").astype(int)

all_features = pd.concat((train_data.iloc[:, 1:-2], test_data.iloc[:, 1:]))

numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index

all_features[numeric_features] = all_features[numeric_features].apply(
    lambda x: (x - x.mean()) / (x.std()))

all_features[numeric_features] = all_features[numeric_features].fillna(0)

all_features = pd.get_dummies(all_features, dummy_na=True)

n_train = train_data.shape[0]

train_features = torch.tensor(all_features[:n_train].values,
                              dtype=torch.float32)
test_features = torch.tensor(all_features[n_train:].values,
                             dtype=torch.float32)

# 修正标签来源,直接用train_data的label列
train_labels = torch.tensor(train_data['label'].values.reshape(-1, 1),
                            dtype=torch.float32)


class Net(nn.Module):
  def __init__(self, in_features, out_features):
    super().__init__()
    self.fc1 = nn.Linear(in_features, 20)
    self.output = nn.Linear(20, out_features)
    self.relu = nn.ReLU()

  def forward(self, x):
    # 修正前向传播逻辑,先走隐藏层+激活,再走输出层
    x = self.relu(self.fc1(x))
    x = self.output(x)
    return torch.sigmoid(x)

# 修正损失函数缩进,放到全局作用域
loss = nn.BCELoss()
in_features = train_features.shape[1]

def train(net, train_features, train_labels,
          num_epochs, learning_rate, weight_decay, batch_size):
  train_ls = []
  train_tensor = torch.utils.data.TensorDataset(train_features, 
                                                train_labels)
  train_loader = torch.utils.data.DataLoader(train_tensor,
                                             batch_size=batch_size, shuffle=False)

  optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate,
                               weight_decay=weight_decay)

  for epoch in range(num_epochs):
    epoch_loss = 0
    for X, y in train_loader:
      optimizer.zero_grad()
      output = net(X)
      l = loss(output, y)
      l.backward()
      optimizer.step()
      epoch_loss += l.item()
    # 修正未定义的lrmse变量,改用计算得到的平均损失
    avg_loss = epoch_loss / len(train_loader)
    train_ls.append(avg_loss)
    if(epoch%10==0):
      print('epoch {}, loss {}'.format(epoch, avg_loss))
  return train_ls


net = Net(in_features, 1)

num_epochs = 2
learning_rate = 0.80
weight_decay = 24
batch_size = 24

train_ls = train(net, train_features, train_labels,
                 num_epochs, learning_rate,
                 weight_decay, batch_size)

内容的提问来源于stack exchange,提问作者user16214190

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 21:15:03