PyTorch回归模型训练异常报错排查:数据集形状一致却出现含1499倍数的矩阵维度不匹配
问题根源与解决方案
让我们一步步拆解这个错误:
核心错误原因
你遇到的RuntimeError本质是模型输入维度和实际数据维度不匹配,但背后有两个关键问题:
模型硬编码输入维度,且循环中未重新初始化模型
你在循环处理9个metrics之前,只初始化了一次model=Regression()——这个模型的第一层固定死了要接收3361维的输入。但在循环过程中,每个metric对应的特征子集(exo_spectra)的特征维度是1499的倍数(不同metric对应不同倍数),你却复用了同一个模型,导致输入的特征维度和模型第一层的预期维度完全不匹配,自然触发矩阵乘法错误。错误假设所有特征子集维度一致
你提到所有数据集形状是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
相关产品推荐
相关产品推荐

