forked from troyyxk/gcgru_stock_prediction
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gcgru.py
106 lines (91 loc) · 3.88 KB
/
gcgru.py
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import AbstractRNNCell
from utils import calculate_laplacian
from tensorflow.keras import backend as K
from tensorflow.keras.activations import sigmoid, tanh
class gcgru(AbstractRNNCell):
def __init__(self, num_units, adj, num_gcn_nodes, s_index, **kwargs):
super(gcgru, self).__init__(**kwargs)
self.units = num_units
self._gcn_nodes = num_gcn_nodes
self.s_index = s_index
adj = tf.sparse.to_dense(calculate_laplacian(adj), default_value=0)
self._adj = adj
@ property
def state_size(self):
return self.units
def build(self, input_shape):
# weights
self.wz = self.add_weight(shape=(self.units, self.units),
initializer='random_normal',
trainable=True,
name='wz')
self.wr = self.add_weight(shape=(self.units, self.units),
initializer='random_normal',
trainable=True,
name='wr')
self.wh = self.add_weight(shape=(self.units, self.units),
initializer='random_normal',
trainable=True,
name='wh')
self.w0 = self.add_weight(shape=(1, self.units),
initializer='random_normal',
trainable=True,
name='w0')
# us
self.uz = self.add_weight(shape=(self.units, self.units),
initializer='random_normal',
trainable=True,
name='wz')
self.ur = self.add_weight(shape=(self.units, self.units),
initializer='random_normal',
trainable=True,
name='ur')
self.uh = self.add_weight(shape=(self.units, self.units),
initializer='random_normal',
trainable=True,
name='uh')
# biases
self.bz = self.add_weight(
shape=(self.units,), initializer="random_normal", trainable=True, name="bz")
self.br = self.add_weight(
shape=(self.units,), initializer="random_normal", trainable=True, name="br")
self.bh = self.add_weight(
shape=(self.units,), initializer="random_normal", trainable=True, name="bh")
self.built = True
def call(self, inputs, states):
# prev_output = states[0]
# h = K.dot(inputs, self.kernel)
# output = h + K.dot(prev_output, self.recurrent_kernel)
# return output, output
state = states[0]
print("---state input----")
print(state)
print(tf.size(state))
print(inputs)
print(tf.size(inputs))
print("---state input----")
# tf.reshape(inputs,shape=[-1, self.units, self.units, self._gcn_nodes])
# tf.reshape(inputs,shape=[-1, self.units, self.units, self._gcn_nodes])
x = self.gc(inputs)
print(self.wz)
print(self.uz)
print(x.shape)
print(self.bz)
z = K.dot(x, self.wz) + K.dot(x, self.uz) + self.bz
z = sigmoid(z)
r = K.dot(x, self.wr) + K.dot(x, self.ur) + self.br
r = sigmoid(r)
h = K.dot(x, self.wh) + K.dot((r*state), self.uh) + self.bh
h = tanh(h)
output = z * state + (1 - z) * h
return output, output
def gc(self, inputs):
'''
1 iteration of gcn, can have mutiple of them.
'''
ax = K.dot(inputs, self._adj)
ax = ax[:, self.s_index]
ax = tf.expand_dims(ax, -1)
return K.dot(ax, self.w0)