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

PyTorch图模型预测结果解读及预测正确性验证问询

结果解读

你的模型输出的元组包含两个核心元素:

  • 第一个张量:当前批次的损失值,grad_fn=<BinaryCrossEntropyWithLogitsBackward0>说明这个损失是通过BinaryCrossEntropyWithLogitsLoss计算的,并且保留了计算图(仅训练阶段需要,用于反向传播更新参数)。损失数值越小,代表模型当前预测和真实标签的差异越小。
  • 第二个张量:模型的原始输出(Logits),也就是模型最后一层未经过激活函数(如sigmoid/softmax)的输出结果。如果是二分类任务,每个图对应一个Logit值;如果是多分类任务,每个图对应一组不同类别的Logit值。
预测正确性验证方法

要验证预测是否正确,需要把Logits转换成可解读的类别,再和真实标签对比:

  1. 转换Logits为预测类别
    • 二分类场景:用sigmoid激活后设置阈值(通常取0.5),大于阈值判定为正类,反之则为负类:
      preds = torch.sigmoid(logits) > 0.5
      
    • 多分类场景:用softmax激活后取最大值对应的索引,即为预测类别:
      preds = torch.argmax(torch.softmax(logits, dim=1), dim=1)
      
  2. 对比真实标签计算准确率
    直接计算预测结果与真实标签y的匹配度:
    accuracy = (preds == y).float().mean().item()
    
    准确率越接近1,说明预测结果越准确。也可以打印单个样本的预测值和真实值,直观核对差异:
    print("真实标签:", y.cpu().numpy())
    print("预测结果:", preds.cpu().numpy())
    
代码示例建议

以下是针对图分类任务的完整推理(预测)代码示例,区分训练与推理阶段的不同处理:

import torch
from torch_geometric.data import DataLoader

# 假设你的图模型类为GNNModel,已完成训练并保存权重
model = GNNModel()
model.load_state_dict(torch.load('trained_gnn_model.pth'))
model.eval()  # 切换到评估模式,关闭dropout、BatchNorm等训练专属操作

# 加载包含10个图的测试数据集,用DataLoader封装
test_dataset = [...]  # 你的测试Data对象集合
test_loader = DataLoader(test_dataset, batch_size=10)

# 推理阶段关闭梯度计算,节省内存并加快速度
with torch.no_grad():
    for batch in test_loader:
        # 从Data对象中取出所需数据
        x, edge_index, y = batch.x, batch.edge_index, batch.y
        
        # 推理时直接获取模型的Logits输出(建议修改模型forward方法,推理时仅返回Logits)
        logits = model(x, edge_index)
        
        # 二分类预测转换示例
        preds = torch.sigmoid(logits) > 0.5
        # 多分类预测转换示例:
        # preds = torch.argmax(torch.softmax(logits, dim=1), dim=1)
        
        # 计算并打印准确率
        accuracy = (preds == y).float().mean().item()
        print(f"当前批次预测准确率: {accuracy:.4f}")
        
        # 打印每个样本的真实标签与预测结果
        print("真实标签列表:", y.cpu().numpy())
        print("预测结果列表:", preds.cpu().numpy())

模型Forward方法优化建议

如果你的模型当前在训练时同时返回损失和Logits,建议修改forward方法,让它在推理时(不传真实标签y)仅返回Logits,避免多余的损失计算:

class GNNModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.backbone = ...  # 你的图神经网络主体结构
        self.loss_fn = torch.nn.BCEWithLogitsLoss()  # 二分类损失
        
    def forward(self, x, edge_index, y=None):
        logits = self.backbone(x, edge_index)
        # 训练阶段传入y,返回损失和Logits;推理阶段仅返回Logits
        if y is not None:
            loss = self.loss_fn(logits, y)
            return loss, logits
        return logits

内容的提问来源于stack exchange,提问作者Slowat_Kela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:09:11