You need to enable JavaScript to run this app. 图神经网络训练准确率异常及PyTorch维度不匹配报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

图神经网络训练准确率异常及PyTorch维度不匹配报错如何解决

问题排查与解决方案

1. 核心逻辑错误:任务类型与损失、评估逻辑不匹配

  • 你数据集的y维度是[10, 12],训练用F.mse_loss计算损失,属于多输出回归任务,但测试阶段用argmax(-1)取类别预测、统计分类正确率的逻辑是针对分类任务的,完全不适用于回归场景,这是准确率异常低的根本原因。
  • 之前的维度报错原因:out的形状是[10,12],out.argmax(-1)会把最后一维(12维)压缩,输出形状为[10],和data.y的[10,12]维度不匹配,你强行把data.y reshape成[-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 16:33:04