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

使用PyTorch Geometric RandomNodeSplit生成划分掩码失败求助

问题原因及解决方法

可能的原因:

  • 已有同名mask存在:如果你的Data对象中已经存在train_mask、val_mask或test_mask属性,RandomNodeSplit默认不会覆盖这些已有属性,会直接返回原数据对象。可以通过print(hasattr(data, 'train_mask'))确认是否存在。
  • PyG版本兼容性问题:部分旧版本的PyTorch Geometric中,RandomNodeSplit变换仅对内置的Planetoid类数据集做了适配,对自定义Data对象的支持不完善。
  • 节点数识别异常:虽然data.x的形状已经隐含了节点数,但少数情况下PyG无法正确识别,导致划分逻辑未触发。

解决方法:

  1. 检查并移除已有mask:
    如果数据中已有mask,先删除再应用变换:

    for key in ['train_mask', 'val_mask', 'test_mask']:
        if hasattr(data, key):
            delattr(data, key)
    split = T.RandomNodeSplit(split='random', num_val=0.1, num_test=0.2)
    data = split(data)
    
  2. 升级PyG版本:
    执行命令升级到最新稳定版:

    pip install --upgrade torch_geometric
    
  3. 显式指定节点数:
    在应用变换前手动设置节点数:

    data.num_nodes = data.x.shape[0]
    split = T.RandomNodeSplit(split='random', num_val=0.1, num_test=0.2)
    data = split(data)
    
  4. 手动生成划分mask:
    如果上述方法都无效,直接手动实现节点划分更可靠:

    import torch
    
    num_nodes = data.x.size(0)
    num_val = int(num_nodes * 0.1)
    num_test = int(num_nodes * 0.2)
    num_train = num_nodes - num_val - num_test
    
    # 生成随机排列的节点索引
    perm = torch.randperm(num_nodes)
    
    # 创建mask
    data.train_mask = torch.zeros(num_nodes, dtype=torch.bool)
    data.val_mask = torch.zeros(num_nodes, dtype=torch.bool)
    data.test_mask = torch.zeros(num_nodes, dtype=torch.bool)
    
    data.train_mask[perm[:num_train]] = True
    data.val_mask[perm[num_train:num_train+num_val]] = True
    data.test_mask[perm[num_train+num_val:]] = True
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:46:02