Repository navigation
Expand file tree
/
Copy pathmodel.py
More file actions
74 lines (54 loc) · 2.13 KB
/
Copy pathmodel.py
File metadata and controls
74 lines (54 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from torch import Tensor
import torch.nn as nn
import torch.nn.functional as F
import torch_geometric.transforms as T
from torch_geometric.nn import MessagePassing
class RelationalModel(nn.Module):
def __init__(self, input_size, output_size, hidden_size):
super(RelationalModel, self).__init__()
self.layers = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, output_size),
)
def forward(self, m):
return self.layers(m)
class ObjectModel(nn.Module):
def __init__(self, input_size, output_size, hidden_size):
super(ObjectModel, self).__init__()
self.layers = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, output_size),
)
def forward(self, C):
return self.layers(C)
class InteractionNetwork(MessagePassing):
def __init__(self, hidden_size):
super(InteractionNetwork, self).__init__(aggr='add',
flow='source_to_target')
self.R1 = RelationalModel(16, 4, hidden_size)
self.O = ObjectModel(10, 3, hidden_size)
self.R2 = RelationalModel(10, 1, hidden_size)
self.E: Tensor = Tensor()
def forward(self, x: Tensor, edge_index: Tensor, edge_attr: Tensor) -> Tensor:
# propagate_type: (x: Tensor, edge_attr: Tensor)
x_tilde = self.propagate(
edge_index, x=x, edge_attr=edge_attr, size=None)
m2 = torch.cat([x_tilde[edge_index[1]],
x_tilde[edge_index[0]],
self.E], dim=1)
return torch.sigmoid(self.R2(m2))
def message(self, x_i, x_j, edge_attr):
# x_i --> incoming
# x_j --> outgoing
m1 = torch.cat([x_i, x_j, edge_attr], dim=1)
self.E = self.R1(m1)
return self.E
def update(self, aggr_out, x):
c = torch.cat([x, aggr_out], dim=1)
return self.O(c)