File size: 2,975 Bytes
a446b0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import time
import numpy as np

import comet.src.train.batch as batch_utils
import comet.utils.utils as utils
import comet.src.evaluate.evaluate as base_evaluate


def make_evaluator(opt, *args, **kwargs):
    return ConceptNetGenerationEvaluator(opt, *args, **kwargs)


class ConceptNetGenerationEvaluator(base_evaluate.Evaluator):
    def __init__(self, opt, model, data_loader, track=False):
        super(ConceptNetGenerationEvaluator, self).__init__(
            opt, model, data_loader)

        if track:
            self.tracker = {"positive": [], "negative": []}
        else:
            self.tracker = None

    def batch(self, opt, nums, average_loss, batch_variables, eval_mode):
        batch_variables["category"] = self.current_category

        outputs = batch_utils.batch_conceptnet_generate(
            opt, nums, average_loss, batch_variables, eval_mode,
            tracking_mode=self.tracker is not None)

        if outputs.get("tracking", None) is not None:
            self.tracker[self.current_category] += outputs["tracking"]

        if outputs["reset"] and batch_variables["category"] == "positive":
            outputs["reset"] = False
            self.current_category = "negative"

        return outputs

    def initialize_losses(self):
        average_loss = {"total_micro": 0, "total_macro": 0,
                        "negative_micro": 0, "negative_macro": 0}
        nums = {"total_micro": 0, "total_macro": 0,
                "negative_micro": 0, "negative_macro": 0}

        self.current_category = "positive"

        if self.tracker is not None:
            self.tracker = {"positive": [], "negative": []}

        return average_loss, nums

    def compute_final_scores(self, average_loss, nums):
        average_loss["total_macro"] /= nums["total_macro"]
        average_loss["total_micro"] /= nums["total_micro"]

        if nums["negative_micro"]:
            average_loss["negative_macro"] /= nums["negative_macro"]
            average_loss["negative_micro"] /= nums["negative_micro"]
        else:
            average_loss["negative_macro"] = 0
            average_loss["negative_micro"] = 0

        average_loss["macro_diff"] = (average_loss["negative_macro"] -
                                      average_loss["total_macro"])
        average_loss["micro_diff"] = (average_loss["negative_micro"] -
                                      average_loss["total_micro"])

        average_loss["ppl_macro"] = np.exp(average_loss["total_macro"])
        average_loss["ppl_micro"] = np.exp(average_loss["total_micro"])

        return average_loss

    def counter(self, nums):
        return nums["total_macro"]

    def print_result(self, split, epoch_losses):
        print("{} Loss: \t {}".format(
            split, epoch_losses["total_micro"]))
        print("{} Diff: \t {}".format(
            split, epoch_losses["micro_diff"]))
        print("{} Perplexity: \t {}".format(
            split, epoch_losses["ppl_micro"]))