Exemple #1
0
def demo_learning_from_semantics(domain):
    from example import Example
    print('\nDemo of learning from semantics')

    # Strip denotations, just to prove that we're learning from semantics.
    def strip_denotation(example):
        return Example(input=example.input, semantics=example.semantics)

    examples = [
        strip_denotation(example) for example in domain.train_examples()
    ]
    model = domain.model()
    model = latent_sgd(model=model,
                       examples=examples,
                       training_metric=SemanticsAccuracyMetric())
Exemple #2
0
    def test_learning_from_semantics(self):
        """
        First 13 examples are used for training.
        Last 4 examples are used for testing.
        b_trn: performance metrics on training set before training
        b_tst: performance metrics on test set before training
        a_trn: performance metrics on training set after training
        a_tst: performance metrics on test set after training

        semantics accuracy: # of examples where parse at position 0 was correct.
        denotation accuracy: # of examples where denotation of parse at position 
        0 was correct
        """
        arithmetic_grammar = Grammar(self.arithmetic_rules)
        arithmetic_examples = self.two_parse_examples + self.one_parse_examples

        from executor import Executor

        arithmetic_model = Model(
            grammar=arithmetic_grammar,
            feature_fn=Parse.operator_precedence_features,
            weights=defaultdict(float),  # Initialize with all weights at zero
            executor=Executor.execute)

        # Train based on correct/incorrect semantics
        from metrics import SemanticsAccuracyMetric

        b_trn, b_tst, a_trn, a_tst = arithmetic_model.train_test(
            train_examples=arithmetic_examples[:13],
            test_examples=arithmetic_examples[13:],
            training_metric=SemanticsAccuracyMetric(),
            seed=1)

        # BEFORE SGD
        self.assertEqual(b_trn['semantics accuracy'], 10)
        self.assertEqual(b_trn['denotation accuracy'], 11)
        self.assertEqual(b_tst['semantics accuracy'], 4)
        self.assertEqual(b_tst['denotation accuracy'], 4)

        # AFTER SGD
        self.assertEqual(a_trn['semantics accuracy'], 13)  # Improvement
        self.assertEqual(a_trn['denotation accuracy'], 13)  # Improvement
        self.assertEqual(a_tst['semantics accuracy'], 4)
        self.assertEqual(a_tst['denotation accuracy'], 4)
Exemple #3
0
def train_test(model=None,
               train_examples=[],
               test_examples=[],
               metrics=standard_metrics(),
               training_metric=SemanticsAccuracyMetric(),
               seed=None,
               print_examples=False):
    # print_grammar(model.grammar)
    # print
    print('%d training examples, %d test examples' %
          (len(train_examples), len(test_examples)))

    # 'Before' test
    model.weights = defaultdict(float)  # no weights
    evaluate_model(model=model,
                   examples=train_examples,
                   examples_label='train',
                   metrics=metrics,
                   print_examples=print_examples)
    evaluate_model(model=model,
                   examples=test_examples,
                   examples_label='test',
                   metrics=metrics,
                   print_examples=print_examples)

    # Train
    model = latent_sgd(model,
                       train_examples,
                       training_metric=training_metric,
                       seed=seed)

    # 'After' test
    evaluate_model(model=model,
                   examples=train_examples,
                   examples_label='train',
                   metrics=metrics,
                   print_examples=print_examples)
    evaluate_model(model=model,
                   examples=test_examples,
                   examples_label='test',
                   metrics=metrics,
                   print_examples=print_examples)
Exemple #4
0
    def train_test(self,
                   train_examples=[],
                   test_examples=[],
                   metrics=standard_metrics(),
                   training_metric=SemanticsAccuracyMetric(),
                   seed=None,
                   print_examples=False):

        # 'Before' test
        self.weights = defaultdict(float)  # no weights
        before_train_metrics = self.evaluate(
            examples=train_examples,
            examples_label='train',
            metrics=metrics,
            print_examples=print_examples)
        before_test_metrics = self.evaluate(
            examples=test_examples,
            examples_label='test',
            metrics=metrics,
            print_examples=print_examples)

        # Train
        model = self.train(train_examples, training_metric=training_metric, seed=seed)

        # 'After' test
        after_train_metrics = model.evaluate(
            examples=train_examples,
            examples_label='train',
            metrics=metrics,
            print_examples=print_examples)
        after_test_metrics = model.evaluate(
            examples=test_examples,
            examples_label='test',
            metrics=metrics,
            print_examples=print_examples)
        return before_train_metrics, before_test_metrics, after_train_metrics, after_test_metrics
Exemple #5
0
 def training_metric(self):
     """
     Returns the evaluation metric which should be used to supervise training
     for this domain.
     """
     return SemanticsAccuracyMetric()