in encoder.py [0:0]
def mlstm(inputs, c, h, M, ndim, scope='lstm', wn=False):
nin = inputs[0].get_shape()[1].value
with tf.variable_scope(scope):
wx = tf.get_variable("wx", [nin, ndim * 4], initializer=load_params)
wh = tf.get_variable("wh", [ndim, ndim * 4], initializer=load_params)
wmx = tf.get_variable("wmx", [nin, ndim], initializer=load_params)
wmh = tf.get_variable("wmh", [ndim, ndim], initializer=load_params)
b = tf.get_variable("b", [ndim * 4], initializer=load_params)
if wn:
gx = tf.get_variable("gx", [ndim * 4], initializer=load_params)
gh = tf.get_variable("gh", [ndim * 4], initializer=load_params)
gmx = tf.get_variable("gmx", [ndim], initializer=load_params)
gmh = tf.get_variable("gmh", [ndim], initializer=load_params)
if wn:
wx = tf.nn.l2_normalize(wx, dim=0) * gx
wh = tf.nn.l2_normalize(wh, dim=0) * gh
wmx = tf.nn.l2_normalize(wmx, dim=0) * gmx
wmh = tf.nn.l2_normalize(wmh, dim=0) * gmh
cs = []
for idx, x in enumerate(inputs):
m = tf.matmul(x, wmx)*tf.matmul(h, wmh)
z = tf.matmul(x, wx) + tf.matmul(m, wh) + b
i, f, o, u = tf.split(z, 4, 1)
i = tf.nn.sigmoid(i)
f = tf.nn.sigmoid(f)
o = tf.nn.sigmoid(o)
u = tf.tanh(u)
if M is not None:
ct = f*c + i*u
ht = o*tf.tanh(ct)
m = M[:, idx, :]
c = ct*m + c*(1-m)
h = ht*m + h*(1-m)
else:
c = f*c + i*u
h = o*tf.tanh(c)
inputs[idx] = h
cs.append(c)
cs = tf.stack(cs)
return inputs, cs, c, h