def tree_lstm(self, left, right):
# A variation on the tree LSTM -- we add an extra hidden layer.
if self._weights is None:
with tf.variable_scope(self._vscope):
self._weights_0 = tf.get_variable(
"weights_0", [FLAGS.vector_size*2, FLAGS.vector_size],
initializer=tf.uniform_unit_scaling_initializer(1.43))
self._bias_0 = tf.get_variable("bias_0", [FLAGS.vector_size],
initializer=tf.zeros_initializer())
self._weights = tf.get_variable(
"weights", [FLAGS.vector_size, FLAGS.vector_size*4],
initializer=tf.uniform_unit_scaling_initializer(1.0))
self._bias = tf.get_variable("bias", [FLAGS.vector_size*4],
initializer=tf.zeros_initializer())
# One hidden layer
x = tf.concat([left, right], 1)
h0 = tf.nn.relu(tf.add(tf.matmul(x, self._weights_0), self._bias_0))
# Do a single matrix multiply to compute all gates
h1 = tf.add(tf.matmul(h0, self._weights), self._bias)
(hfl, hfr, hi, hg) = tf.split(h1, 4, axis=1)
fl = tf.nn.sigmoid(hfl) # forget left
fr = tf.nn.sigmoid(hfr) # forget right
i = tf.nn.sigmoid(hi) # input gate
g = tf.nn.tanh(hg) # computation
ylr = tf.add(tf.multiply(fl, left), tf.multiply(fr, right))
ygi = tf.multiply(i, g)
y = tf.add(ylr, ygi)
return y
评论列表
文章目录