def forward(self, inputs):
c_prev1, c_prev2, x1, x2 = inputs
a1, i1, f1, o1 = _extract_gates(x1)
a2, i2, f2, o2 = _extract_gates(x2)
if isinstance(x1, numpy.ndarray):
self.a1 = numpy.tanh(a1)
self.i1 = _sigmoid(i1)
self.f1 = _sigmoid(f1)
self.a2 = numpy.tanh(a2)
self.i2 = _sigmoid(i2)
self.f2 = _sigmoid(f2)
self.o = _sigmoid(o1 + o2)
self.c = self.a1 * self.i1 + self.a2 * self.i2 + \
self.f1 * c_prev1 + self.f2 * c_prev2
h = self.o * numpy.tanh(self.c)
else:
self.c, h = cuda.elementwise(
'''T c_prev1, T a1, T i1, T f1, T o1,
T c_prev2, T a2, T i2, T f2, T o2''',
'T c, T h',
'''
COMMON_ROUTINE;
c = aa1 * ai1 + af1 * c_prev1 + aa2 * ai2 + af2 * c_prev2;
h = ao * tanh(c);
''',
'slstm_fwd', preamble=_preamble)(
c_prev1, a1, i1, f1, o1, c_prev2, a2, i2, f2, o2)
return self.c, h
评论列表
文章目录