图神经网络训练准确率异常及PyTorch维度不匹配报错如何解决
问题排查与解决方案
1. 核心逻辑错误:任务类型与损失、评估逻辑不匹配
- 你数据集的y维度是
[10, 12],训练用F.mse_loss计算损失,属于多输出回归任务,但测试阶段用argmax(-1)取类别预测、统计分类正确率的逻辑是针对分类任务的,完全不适用于回归场景,这是准确率异常低的根本原因。 - 之前的维度报错原因:
out的形状是[10,12],out.argmax(-1)会把最后一维(12维)压缩,输出形状为[10],和data.y的[10,12]维度不匹配,你强行把data.yreshape成[-1,1]之后,是用形状为[10]的预测值和形状为[120,1]的标签做广播比较,计算结果完全没有意义,自然准确率极低。
2. 代码错误修正
如果你确实是做多输出回归任务:
删掉分类准确率的计算逻辑,改用回归指标评估,比如MAE、RMSE、R²分数:
# 测试函数回归评估示例 def test(loader): model.eval() total_mae = 0 total_samples = 0 with torch.no_grad(): # 必须加no_grad节省显存、避免无效梯度计算 for data in loader: data = data.to(device) out = model(data) mae = F.l1_loss(out, data.y, reduction='sum') total_mae += mae.item() total_samples += data.y.numel() avg_mae = total_mae / total_samples return avg_mae
如果你实际是做12分类任务:
首先确认数据集标签格式:分类任务的标签应该是每个样本对应一个类别索引,y的形状应该是[10],如果你的[10,12]是onehot编码的标签,训练时应该用交叉熵损失,而不是MSE损失:
# 分类任务损失修正 loss = F.cross_entropy(out, data.y.argmax(-1)) # y为onehot编码时先转类别索引
准确率计算时维度要对应,且分母为总样本数而非批次数量:
pred = out.argmax(-1) # 形状[10] label = data.y.argmax(-1) # 形状[10] correct += int((pred == label).sum()) # 最终准确率计算:correct / 总样本数,而非correct / len(loader)
3. 其他需要修正的代码问题
- 你的
forward函数没有写返回值,最后要补return x,否则模型输出为None,无法正常训练。 - 训练循环里
csvwriter作用域错误,train函数内调用的外层csvwriter容易出现文件句柄异常,建议把写日志逻辑移到循环外层,或在train函数内单独打开文件处理。 - 定义模型时变量名是
Model=Net(),后续优化器调用的是model.parameters(),注意大小写统一,否则会报参数为空错误。
内容的提问来源于stack exchange,提问作者Jewel_R
相关产品推荐
相关产品推荐

