问题描述
将 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 (将#修改为@)