这个问题在不同的framework上碰到过很多次了。我之前没有用过DGL实现过RGCN,简单看了一下网上的例子,按照这里:
dgl.nn.pytorch.conv.relgraphconv — DGL 0.8.1 documentation
和GCN的区别就是forward中要输入一个表示edge类型的tensor,我就是因为这里的输入有点问题,所以才报错了。具体来说,看这里注释中的例子:
dgl/relgraphconv.py at master · dmlc/dgl · GitHub
输入的tensor,类型下标应该从0开始:
Examples
--------
>>> import dgl
>>> import numpy as np
>>> import torch as th
>>> from dgl.nn import RelGraphConv
>>>
>>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
>>> feat = th.ones(6, 10)
>>> conv = RelGraphConv(10, 2, 3, regularizer='basis', num_bases=2)
>>> etype = th.tensor([0,1,2,0,1,2])
>>> res = conv(g, feat, etype)
>>> res
tensor([[ 0.3996, -2.3303],
[-0.4323, -0.1440],
[ 0.3996, -2.3303],
[ 2.1046, -2.8654],
[-0.4323, -0.1440],
[-0.1309, -1.0000]], grad_fn=<AddBackward0>)
"""
但是我输入edge type的时候,竟然是从1开始的,因为懒没有注意到,类似于这种:
ddgraph.edges[records[0],records[1]]['type']=1
联想到这个报错其实很多是和index越界相关的,例如这里说的:Assertion `srcIndex < srcSelectDimSize` failed._kejizuiqianfang的博客-CSDN博客
还有我之前的博客:使用huggingface‘s transformers预训练自己模型时报:Assertion ‘srcIndex < srcSelectDimSize‘ failed. 的解决办法_蛐蛐蛐的博客-CSDN博客
所以改成边的类型编号从0开始,就可以解决这个报错了。
|