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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:20:26