PyTorch图模型预测结果解读及预测正确性验证问询
结果解读
你的模型输出的元组包含两个核心元素:
- 第一个张量:当前批次的损失值,
grad_fn=<BinaryCrossEntropyWithLogitsBackward0>说明这个损失是通过BinaryCrossEntropyWithLogitsLoss计算的,并且保留了计算图(仅训练阶段需要,用于反向传播更新参数)。损失数值越小,代表模型当前预测和真实标签的差异越小。 - 第二个张量:模型的原始输出(Logits),也就是模型最后一层未经过激活函数(如sigmoid/softmax)的输出结果。如果是二分类任务,每个图对应一个Logit值;如果是多分类任务,每个图对应一组不同类别的Logit值。
预测正确性验证方法
要验证预测是否正确,需要把Logits转换成可解读的类别,再和真实标签对比:
- 转换Logits为预测类别
- 二分类场景:用
sigmoid激活后设置阈值(通常取0.5),大于阈值判定为正类,反之则为负类:preds = torch.sigmoid(logits) > 0.5 - 多分类场景:用
softmax激活后取最大值对应的索引,即为预测类别:preds = torch.argmax(torch.softmax(logits, dim=1), dim=1)
- 二分类场景:用
- 对比真实标签计算准确率
直接计算预测结果与真实标签y的匹配度:
准确率越接近1,说明预测结果越准确。也可以打印单个样本的预测值和真实值,直观核对差异:accuracy = (preds == y).float().mean().item()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
相关产品推荐
相关产品推荐

