def __call__(self, hs, ys): """Core function of the Warp-CTC layer. Args: hs (iterable of chainer.Variable | N-dimention array): Input variable from encoder. ys (iterable of chainer.Variable | N-dimension array): Input variable of decoder. Returns: chainer.Variable: A variable holding a scalar value of the CTC loss. """ self.loss = None ilens = [x.shape[0] for x in hs] olens = [x.shape[0] for x in ys] # zero padding for hs y_hat = linear_tensor(self.ctc_lo, F.dropout( F.pad_sequence(hs), ratio=self.dropout_rate)) y_hat = F.transpose(y_hat, (1, 0, 2)) # batch x frames x hdim # get length info logging.info(self.__class__.__name__ + ' input lengths: ' + str(ilens)) logging.info(self.__class__.__name__ + ' output lengths: ' + str(olens)) # get ctc loss from chainer_ctc.warpctc import ctc as warp_ctc self.loss = warp_ctc(y_hat, ilens, [cuda.to_cpu(l.data) for l in ys])[0] logging.info('ctc loss:' + str(self.loss.data)) return self.loss
def __call__(self, hs, ys): '''CTC forward :param hs: :param ys: :return: ''' self.loss = None ilens = [x.shape[0] for x in hs] olens = [x.shape[0] for x in ys] # zero padding for hs y_hat = linear_tensor(self.ctc_lo, F.dropout( F.pad_sequence(hs), ratio=self.dropout_rate)) y_hat = F.transpose(y_hat, (1, 0, 2)) # batch x frames x hdim # get length info logging.info(self.__class__.__name__ + ' input lengths: ' + str(ilens)) logging.info(self.__class__.__name__ + ' output lengths: ' + str(olens)) # get ctc loss self.loss = warp_ctc(y_hat, ilens, [cuda.to_cpu(l.data) for l in ys])[0] logging.info('ctc loss:' + str(self.loss.data)) return self.loss