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

PyTorch回归模型训练异常报错排查:数据集形状一致却出现含1499倍数的矩阵维度不匹配

问题根源与解决方案

让我们一步步拆解这个错误:

核心错误原因

你遇到的RuntimeError本质是模型输入维度和实际数据维度不匹配,但背后有两个关键问题:

  1. 模型硬编码输入维度,且循环中未重新初始化模型
    你在循环处理9个metrics之前,只初始化了一次model=Regression()——这个模型的第一层固定死了要接收3361维的输入。但在循环过程中,每个metric对应的特征子集(exo_spectra)的特征维度是1499的倍数(不同metric对应不同倍数),你却复用了同一个模型,导致输入的特征维度和模型第一层的预期维度完全不匹配,自然触发矩阵乘法错误。

  2. 错误假设所有特征子集维度一致
    你提到所有数据集形状是10×3361,但实际在处理不同metric时,exo_spectra的列数(特征维度)是变化的(1499的倍数),和你硬编码的3361完全对不上。而且你代码里计算了input_size = exo_data.shape[1],却根本没用到这个值,白白浪费了动态适配的机会。

具体修复步骤

1. 修改模型为动态输入维度

把Regression类改成接受input_size参数,不再硬编码3361:

# define neural network model for regression
class Regression(nn.Module):
    def __init__(self, input_size):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(input_size, 64),
            nn.ReLU(),
            nn.Linear(64, 32),
            nn.ReLU(),
            nn.Linear(32, 1)
        )
    def forward(self, x):
        ''' Forward pass '''
        return self.layers(x)

2. 在每个metric循环中重新初始化模型和优化器

因为每个metric对应的特征维度不同,必须为每个任务创建新模型,同时重新定义优化器(优化器是和模型参数绑定的):

for metric in metrics:
    # split and format data
    exo_target=exo_metrics[metric]
    X_train, X_test, y_train, y_test = train_test_split(exo_spectra,exo_target, test_size=0.2, random_state=23)
    
    # 简化tensor转换(去掉冗余代码)
    X_train_tensor = torch.from_numpy(X_train).float()
    y_train_tensor = torch.from_numpy(y_train.values).float()
    X_test_tensor = torch.from_numpy(X_test).float()
    y_test_tensor = torch.from_numpy(y_test.values).float()
    
    # 获取当前特征子集的输入维度
    current_input_size = X_train.shape[1]
    # 为当前任务重新初始化模型
    model = Regression(current_input_size)
    # 重新绑定优化器到新模型
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
    
    # load data
    train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
    train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
    # train data and assess accuracy
    model=training_loop(n_epochs,train_loader)
    y_pred = model(X_test_tensor)
    model_score=r2_score(y_test_tensor.detach().numpy(),y_pred.detach().numpy())
    scores.append(model_score)

3. 可选:添加维度验证

在循环里加一句打印,确认每个特征子集的维度,方便排查问题:

print(f"处理metric {metric}: X_train形状为 {X_train.shape}")

额外小优化

你代码里的tensor转换有冗余,可以简化:

# 原冗余代码
X_train_tensor = torch.from_numpy(X_train)
X_train_tensor = torch.tensor(X_train_tensor,dtype=torch.float32)

# 简化后
X_train_tensor = torch.from_numpy(X_train).float()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 09:29:07