def get_layer(self, x_in):
assert x_in.ndim == 2
n_steps = x_in.shape[0]
def __slice(x_, n, dim):
return x_[n * dim: (n + 1) * dim]
def __step(x_, h_, c_):
preact = T.dot(h_, self._params['U']) + x_ + self._params['b']
i = T.nnet.sigmoid(__slice(preact, 0, self._ydim))
f = T.nnet.sigmoid(__slice(preact, 1, self._ydim))
o = T.nnet.sigmoid(__slice(preact, 2, self._ydim))
c = T.tanh(__slice(preact, 3, self._ydim))
c = f * c_ + i * c
h = o * T.tanh(c)
return h, c
x_in = T.dot(x_in, self._params['W']) + self._params['b']
rval, updates = theano.scan(__step, sequences=x_in, go_backwards=self.go_backwards,
outputs_info=[T.alloc(np_floatX(0.), self._ydim),
T.alloc(np_floatX(0.), self._ydim)],
name='lstm_layers', n_steps=n_steps)
return reverse(rval[0]) if self.go_backwards else rval[0]
评论列表
文章目录