使用DGL实现RGCN时报Assertion srcIndex < srcSelectDimSize failed.的解决办法

这个问题在不同的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开始,就可以解决这个报错了。

SAT(布尔可满足性问题)是计算机科学中一个非常重要的问题,其解决方法可以应用于很多领域,例如计算机科学、人工智能、计算机网络和密码学等。在SAT问题中,我们需要找到一组布尔变量的赋值,使得一个逻辑公式能够被满足。 DGL(Deep Graph Library)是一个用于图神经网络的Python库。它提供了一组高效的API,用于构建、训练和评估图神经网络模型。为了使用dgl实现SAT模型,我们可以将SAT问题转换为一个图结构,其中节点代表布尔变量,边代表逻辑关系。然后,我们可以使用dgl构建和训练图神经网络模型,以解决SAT问题。 以下是一个简单的SAT模型实现使用dgl库来构建和训练图神经网络模型: ``` import dgl import torch import torch.nn as nn import torch.nn.functional as F # Convert SAT problem to graph def sat_to_graph(clauses): g = dgl.graph() # Add nodes n = len(clauses) g.add_nodes(n) # Add edges for i in range(n): for j in range(n): if i != j: for a in clauses[i]: for b in clauses[j]: if a == -b: g.add_edge(i, j) return g # Define graph convolutional neural network model class GCN(nn.Module): def __init__(self, in_feats, hidden_feats, out_feats): super(GCN, self).__init__() self.conv1 = dgl.nn.GraphConv(in_feats, hidden_feats) self.conv2 = dgl.nn.GraphConv(hidden_feats, out_feats) def forward(self, g, inputs): h = self.conv1(g, inputs) h = F.relu(h) h = self.conv2(g, h) return h # Define training function def train(model, g, inputs, labels, optimizer): model.train() logits = model(g, inputs) loss = F.cross_entropy(logits, labels) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() # Define test function def test(model, g, inputs, labels): model.eval() with torch.no_grad(): logits = model(g, inputs) pred = logits.argmax(1) acc = (pred == labels).float().mean() return acc.item() # Define main function if __name__ == '__main__': # Define SAT problem clauses = [[1, 2, -3], [-1, -2, 3], [2, 3, 4], [1, -3, 4], [-2, -4]] # Convert SAT problem to graph g = sat_to_graph(clauses) # Define model and optimizer model = GCN(g.ndata['feat'].shape[1], 16, 2) optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # Train and test model for epoch in range(100): loss = train(model, g, g.ndata['feat'], g.ndata['label'], optimizer) acc = test(model, g, g.ndata['feat'], g.ndata['label']) print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss, acc)) ``` 在这个例子中,我们首先将SAT问题转换为一个图结构,然后定义了一个包含两层图卷积层的GCN模型。我们使用Adam优化器来训练模型,每个epoch都计算训练损失和测试准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值