为什么将 GNN 与 dgl 异质图结合使用会遇到行数据不匹配错误?

问题描述

将 GNN 与 HetreoGraph 结合使用是否正确?

代码运行几次会报错,其他的都正常。

复制

多次运行代码会报错: DGLError:预期数据有 X 行,得到 Y。

import numpy as np

import torch
import torch.optim as optim
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as Data

import dgl
from dgl import DGLGraph
import dgl.nn as dglnn

class RGNN(nn.Module):
    def __init__(self,in_size,hid_size,out_size,rel_names):
        super().__init__()
        self.conv1 =  dglnn.HeteroGraphConv({rel : dglnn.GraphConv(in_size,hid_size) \
                                             for rel in rel_names},aggregate="sum")
        self.conv2 =  dglnn.HeteroGraphConv({rel : dglnn.GraphConv(hid_size,out_size) \
                                             for rel in rel_names},aggregate="sum")
        self.conv3 =  dglnn.HeteroGraphConv({rel : dglnn.GraphConv(out_size,aggregate="sum")
        self.dropout=nn.Dropout(p=0.2)
        
    def forward(self,blocks,in_feats):
        print("before conv1",in_feats["user"].shape,in_feats["game"].shape)
        h = self.conv1(blocks[0],in_feats)
        print("after conv1",h["user"].shape,h["game"].shape)
        h = self.conv2(blocks[1],h)
        print("after conv2",h["game"].shape)
        h = self.conv3(blocks[2],h)
        print("conv3",h["game"].shape)
        return h

    
hetero_frontier = dgl.heterograph({
    ('user','follow','user'): ([1,3,7,1,2,4,5,6,8,9],[3,5]),('user','play','game'): ([5,4] + list(range(10)),[6,2] + list(np.random.randint(0,10,(1,10)).squeeze()))},num_nodes_dict={'user': 10,'game': 10})

embed_size = 128
hetero_frontier.nodes['user'].data['embedding'] = torch.FloatTensor(np.random.normal(0,0.01,(10,embed_size)))
hetero_frontier.nodes['game'].data['embedding'] = torch.FloatTensor(np.random.normal(0,embed_size)))

model = RGNN(embed_size,embed_size,hetero_frontier.etypes)  

train_nid_dict = {"user":list(np.random.randint(0,5)).squeeze()),"game":np.random.randint(10)}
sampler = dgl.dataloading.MultiLayerFullNeighborSampler(3)
DataLoader = dgl.dataloading.NodeDataLoader(hetero_frontier,train_nid_dict,sampler,batch_size=128,shuffle=False,drop_last=False,num_workers=1)
for input_nodes,output_nodes,blocks in DataLoader:
    print("input nodes",input_nodes["user"].shape,input_nodes["game"].shape)
    for idx,block in enumerate(blocks):
        print("block ",idx,block.srcdata["embedding"]["user"].shape,block.srcdata["embedding"]["game"].shape)
    print("ouput nodes",output_nodes["user"].shape,output_nodes["game"].shape)

    input_features = blocks[0].srcdata["embedding"]     # returns a dict     
    output_features = model(blocks,input_features)

DGLError:预期数据有 5 行,得到 4。但是我遵循 guideline

预期行为

无尺寸错误

环境

  • DGL 0.6.1 版
  • PyTorch 1.8.1
  • Mac 操作系统:
  • 您如何安装 DGL:conda
  • Python 版本:3.7
  • CUDA/cuDNN 版本(如果适用):仅限 cpu

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)