예제 #1
0
    def eval(self):
        self.model.eval()
        pred_result = {}

        for _, batch in enumerate(self.dataloader_dev):

            question_ids, question, question_char, question_mask, \
            passage, passage_char, passage_mask, passage_tokenized = batch
            begin_, end_ = self.model(question, question_char, question_mask, passage, passage_char,
                                      passage_mask)  # batch x seq
            probability = torch.bmm(F.softmax(begin_, dim=-1).unsqueeze(2),
                                    F.softmax(end_, dim=-1).unsqueeze(1)).cpu().numpy()
            mask = np.float32(np.fromfunction(lambda k, i, j: (i - j <= 15) & (i <= j),
                                              (1, probability.shape[1], probability.shape[2])))

            probability = mask * probability
            pred_begin = np.argmax(np.amax(probability, axis=2), axis=1)
            pred_end = np.argmax(np.amax(probability, axis=1), axis=1)

            for i, (begin, end) in enumerate(zip(pred_begin, pred_end)):
                ans = passage_tokenized[i][begin:end + 1]
                qid = question_ids[i]
                pred_result[qid] = " ".join(ans)
        self.model.train()
        em, f1 = evaluate(self.dev_dataset, pred_result)
        self.scheduler.step(em)
        return em, f1
예제 #2
0
    def eval(self, args):
        self.model.eval()
        pred_result = {}
        for _, batch in enumerate(self.dataloader_dev):

            question_ids, questions, passages, passage_tokenized = batch
            questions.variable(args, volatile=True)
            passages.variable(args, volatile=True)
            begin_, end_ = self.model(questions, passages)  # batch x seq

            _, pred_begin = torch.max(begin_, 1)
            _, pred_end = torch.max(end_, 1)

            pred = torch.stack([pred_begin, pred_end], dim=1)

            for i, (begin, end) in enumerate(pred.cpu().data.numpy()):
                ans = passage_tokenized[i][begin:end + 1]
                qid = question_ids[i]
                pred_result[qid] = " ".join(ans)
        self.model.train()
        return evaluate(self.dev_dataset, pred_result)