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
| def __call__(self, inputs, state, scope=None): with tf.variable_scope(scope or type(self).__name__): if self._state_is_tuple: c, h = state else: c, h = tf.split(value=state, num_or_size_splits=2, axis=1) laplacian = self._laplacian lmax = self._lmax K = self._K feat_in = self._feat_in
if feat_in is None: batch_size, nNode, feat_in = inputs.get_shape() print("hey!")
feat_out = self._num_units
if K is None: K = 2
scope = tf.get_variable_scope() with tf.variable_scope(scope) as scope: try: Wzxt = tf.get_variable("Wzxt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wixt = tf.get_variable("Wixt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wfxt = tf.get_variable("Wfxt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Woxt = tf.get_variable("Woxt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1))
Wzht = tf.get_variable("Wzht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wiht = tf.get_variable("Wiht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wfht = tf.get_variable("Wfht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Woht = tf.get_variable("Woht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) except ValueError: scope.reuse_variables() Wzxt = tf.get_variable("Wzxt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wixt = tf.get_variable("Wixt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wfxt = tf.get_variable("Wfxt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Woxt = tf.get_variable("Woxt", [K*feat_in, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1))
Wzht = tf.get_variable("Wzht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wiht = tf.get_variable("Wiht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Wfht = tf.get_variable("Wfht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1)) Woht = tf.get_variable("Woht", [K*feat_out, feat_out], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1))
bzt = tf.get_variable("bzt", [feat_out]) bit = tf.get_variable("bit", [feat_out]) bft = tf.get_variable("bft", [feat_out]) bot = tf.get_variable("bot", [feat_out])
zxt = cheby_conv(inputs, laplacian, lmax, feat_out, K, Wzxt) zht = cheby_conv(h, laplacian, lmax, feat_out, K, Wzht) zt = zxt + zht + bzt zt = tf.tanh(zt)
ixt = cheby_conv(inputs, laplacian, lmax, feat_out, K, Wixt) iht = cheby_conv(h, laplacian, lmax, feat_out, K, Wiht) it = ixt + iht + bit it = tf.sigmoid(it)
fxt = cheby_conv(inputs, laplacian, lmax, feat_out, K, Wfxt) fht = cheby_conv(h, laplacian, lmax, feat_out, K, Wfht) ft = fxt + fht + bft ft = tf.sigmoid(ft)
oxt = cheby_conv(inputs, laplacian, lmax, feat_out, K, Woxt) oht = cheby_conv(h, laplacian, lmax, feat_out, K, Woht) ot = oxt + oht + bot ot = tf.sigmoid(ot)
new_c = ft*c + it*zt
new_h = ot*tf.tanh(new_c)
if self._state_is_tuple: new_state = LSTMStateTuple(new_c, new_h) else: new_state = tf.concat([new_c, new_h], 1) return new_h, new_state
|