PyTorch中FNN线性回归模型测试尺寸不匹配及准确率为0问题
问题分析与解决方案
1. RuntimeError 维度不匹配的原因
你的代码核心错误在于:testloader循环中始终使用全局的Y_Test(尺寸[64000,2]),但每次迭代生成的pred是当前batch的输出(尺寸[100,2]),两者维度完全不匹配,触发了维度错误。
循环里的T_Val才是当前batch对应的真实标签,所有涉及标签的计算都应该用T_Val而非全局的Y_Test。
2. 准确率始终为0的原因
线性回归是回归任务,预测的是连续数值,但你误用了分类任务的准确率计算逻辑:用torch.max(pred.data,1)取类别索引,再和真实值比较相等的数量。
回归任务的真实值是连续浮点数,预测值几乎不可能和真实值完全相等,所以(predicted == Y_Test).sum()永远为0,准确率自然是0。
修正后的测试代码
X_Test = torch.tensor(PA_DATA[:64000,0:2], dtype=torch.float32) Y_Test = torch.tensor(PA_DATA[:64000,2:4], dtype=torch.float32) test_dataset = Data.TensorDataset(X_Test, Y_Test) testloader = DataLoader(test_dataset, batch_size=100, shuffle=False) loss_func1 = torch.nn.MSELoss() # 测试阶段不需要optimizer,直接删除 # optimizer = torch.optim.Adam(model.parameters(), lr=0.0001) running_test_loss = 0.0 total_samples = 0 # 回归任务用MAE(平均绝对误差)作为评估指标 running_mae = 0.0 with torch.no_grad(): model.eval() for batch_x, batch_y in testloader: pred = model(batch_x) # 用当前batch的标签计算损失 test_loss = loss_func1(pred, batch_y) running_test_loss += test_loss.item() * batch_x.size(0) total_samples += batch_x.size(0) # 计算当前batch的MAE并累加 mae = torch.abs(pred - batch_y).mean() running_mae += mae.item() * batch_x.size(0) # 计算全局平均指标 avg_test_loss = running_test_loss / total_samples avg_mae = running_mae / total_samples print(f"平均测试MSE损失: {avg_test_loss}") print(f"平均测试MAE: {avg_mae}")
补充说明
- 回归任务的常用评估指标是MSE、MAE、RMSE或R²分数,不要用分类任务的准确率。
- 测试阶段无需定义optimizer,这部分代码可以直接删除。
- 累加损失时乘以batch_size,避免最后一个batch尺寸不足导致的平均误差偏差。
内容的提问来源于stack exchange,提问作者rashid
相关产品推荐
相关产品推荐

