model.py 1.56 KB
Newer Older
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
1
import dgl
2
import torch as th
Lingfan Yu's avatar
Lingfan Yu committed
3
import torch.nn as nn
Mufei Li's avatar
Mufei Li committed
4
import torch.nn.functional as F
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
5
from dgl import DGLGraph
6

Mufei Li's avatar
Mufei Li committed
7
from dgl.nn.pytorch import RelGraphConv
Lingfan Yu's avatar
Lingfan Yu committed
8

Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
9

Mufei Li's avatar
Mufei Li committed
10
class RGCN(nn.Module):
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
11
12
13
14
15
16
17
18
19
20
21
22
    def __init__(
        self,
        num_nodes,
        h_dim,
        out_dim,
        num_rels,
        regularizer="basis",
        num_bases=-1,
        dropout=0.0,
        self_loop=False,
        ns_mode=False,
    ):
Mufei Li's avatar
Mufei Li committed
23
        super(RGCN, self).__init__()
Lingfan Yu's avatar
Lingfan Yu committed
24

25
26
27
        if num_bases == -1:
            num_bases = num_rels
        self.emb = nn.Embedding(num_nodes, h_dim)
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
28
29
30
31
32
33
34
35
36
37
38
        self.conv1 = RelGraphConv(
            h_dim, h_dim, num_rels, regularizer, num_bases, self_loop=self_loop
        )
        self.conv2 = RelGraphConv(
            h_dim,
            out_dim,
            num_rels,
            regularizer,
            num_bases,
            self_loop=self_loop,
        )
39
40
41
42
43
44
45
        self.dropout = nn.Dropout(dropout)
        self.ns_mode = ns_mode

    def forward(self, g, nids=None):
        if self.ns_mode:
            # forward for neighbor sampling
            x = self.emb(g[0].srcdata[dgl.NID])
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
46
            h = self.conv1(g[0], x, g[0].edata[dgl.ETYPE], g[0].edata["norm"])
47
            h = self.dropout(F.relu(h))
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
48
            h = self.conv2(g[1], h, g[1].edata[dgl.ETYPE], g[1].edata["norm"])
49
            return h
Mufei Li's avatar
Mufei Li committed
50
        else:
51
            x = self.emb.weight if nids is None else self.emb(nids)
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
52
            h = self.conv1(g, x, g.edata[dgl.ETYPE], g.edata["norm"])
53
            h = self.dropout(F.relu(h))
Hongzhi (Steve), Chen's avatar
Hongzhi (Steve), Chen committed
54
            h = self.conv2(g, h, g.edata[dgl.ETYPE], g.edata["norm"])
55
            return h