model.py 1.45 KB
Newer Older
Mufei Li's avatar
Mufei Li committed
1
from dgl import DGLGraph
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
5
6
import dgl

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

Mufei Li's avatar
Mufei Li committed
9
class RGCN(nn.Module):
10
    def __init__(self, num_nodes, h_dim, out_dim, num_rels,
Mufei Li's avatar
Mufei Li committed
11
                 regularizer="basis", num_bases=-1, dropout=0.,
12
13
                 self_loop=False,
                 ns_mode=False):
Mufei Li's avatar
Mufei Li committed
14
        super(RGCN, self).__init__()
Lingfan Yu's avatar
Lingfan Yu committed
15

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
        if num_bases == -1:
            num_bases = num_rels
        self.emb = nn.Embedding(num_nodes, h_dim)
        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)
        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])
            h = self.conv1(g[0], x, g[0].edata[dgl.ETYPE], g[0].edata['norm'])
            h = self.dropout(F.relu(h))
            h = self.conv2(g[1], h, g[1].edata[dgl.ETYPE], g[1].edata['norm'])
            return h
Mufei Li's avatar
Mufei Li committed
33
        else:
34
35
36
37
38
            x = self.emb.weight if nids is None else self.emb(nids)
            h = self.conv1(g, x, g.edata[dgl.ETYPE], g.edata['norm'])
            h = self.dropout(F.relu(h))
            h = self.conv2(g, h, g.edata[dgl.ETYPE], g.edata['norm'])
            return h