def test_on_batch(self, inputs, outputs, verbose=0): """ :param inputs: :param outputs: :param verbose: :return: """ grapheme_root = Tensor(outputs[0]) vowel_diacritic = Tensor(outputs[1]) consonant_diacritic = Tensor(outputs[2]) _, grapheme_root_tru = grapheme_root.max(1) _, vowel_diacritic_tru = vowel_diacritic.max(1) _, consonant_diacritic_tru = consonant_diacritic.max(1) grapheme_root_hat, vowel_diacritic_hat, consonant_diacritic_hat = self.predict(inputs) grapheme_root_hat = grapheme_root_hat.cpu() vowel_diacritic_hat = vowel_diacritic_hat.cpu() consonant_diacritic_hat = consonant_diacritic_hat.cpu() if verbose == 1: print(grapheme_root_tru[:10]) print(grapheme_root_hat[:10]) print(vowel_diacritic_tru[:10]) print(vowel_diacritic_hat[:10]) print(consonant_diacritic_tru[:10]) print(consonant_diacritic_hat[:10]) grapheme_root = accuracy_score(grapheme_root_tru, grapheme_root_hat) vowel_diacritic = accuracy_score(vowel_diacritic_tru, vowel_diacritic_hat) consonant_diacritic = accuracy_score(consonant_diacritic_tru, consonant_diacritic_hat) print("accuracy: grapheme root {}, vowel diacritic {}, consonant diacritic {}".format(grapheme_root, vowel_diacritic, consonant_diacritic))
def logsumexp(x: Tensor, dim: int) -> Tensor: """ Args: x: A pytorch tensor (any dimension will do) dim: int, over which to perform the summation. Returns: The result of the log(sum(exp(...))) operation. """ xmax, _ = x.max(dim, keepdim=True) xmax_, _ = x.max(dim) return xmax_ + torch.log(torch.exp(x - xmax).sum(dim))