Exemplo n.º 1
0
    def build_grid(self, batch):
        options = self.options
        # for inst in batch:
        #     for i in range(len(inst.context)):
        #         for utt in sample_utts(inst.context, i):
        #             (utt -> inst.context, i)
        sampler_inputs = [
            instance.Instance(i, None, alt_inputs=inst.alt_outputs)
            for inst in batch for i in range(len(inst.alt_outputs))
            for _ in range(options.ac_num_samples)
        ]
        context_len = len(batch[0].alt_outputs)
        assert len(sampler_inputs) == (len(batch) *
                                       context_len *
                                       options.ac_num_samples), \
            'Building grid: inconsistent context length %s' % \
            (len(sampler_inputs), len(batch),
             context_len, options.ac_num_samples)
        outputs = self.sampler.sample(sampler_inputs)
        if self.options.verbosity >= 8:
            print('S0 samples:')
            for inst, output in zip(sampler_inputs, outputs):
                print("%s -> %s" % (inst.alt_inputs[inst.input], repr(output)))
        outputs = (np.array(outputs).reshape(
            len(batch), context_len * options.ac_num_samples).tolist())

        return [
            instance.Instance(utt, 0, alt_outputs=[(0, 0, 0)] * context_len)
            for inst, samples in zip(batch, outputs)
            for utt in [inst.input] + samples
        ]
Exemplo n.º 2
0
    def build_grid(self, batch, all_utts):
        # for inst in batch:
        #     for j in range(num_sample_sets):
        #         for i in range(len(inst.context)):
        #             for utt in sample_utts(inst.context, i):
        #                 (utt -> inst.context, i)
        options = self.get_options()
        if options.exhaustive_num_samples > 0:
            sampler_inputs = [
                instance.Instance(i, None, alt_inputs=inst.alt_outputs)
                for inst in batch
                for _ in range(options.exhaustive_num_sample_sets)
                for i in range(len(inst.alt_outputs))
                for _ in range(options.exhaustive_num_samples)
            ]
            context_len = len(batch[0].alt_outputs)
            assert len(sampler_inputs) == (len(batch) *
                                           options.exhaustive_num_sample_sets *
                                           context_len *
                                           options.exhaustive_num_samples), \
                'Building grid: inconsistent context length %s' % \
                (len(sampler_inputs), len(batch), options.exhaustive_num_sample_sets,
                 context_len, options.exhaustive_num_samples)
            outputs = self.sampler.sample(sampler_inputs)
            if options.exhaustive_reject_duplicates > 0:
                dupes = None
                for _ in range(options.exhaustive_reject_duplicates):
                    dupes = self.get_duplicate_indices(
                        outputs, batch, options.exhaustive_num_sample_sets,
                        dupes)
                    if len(dupes) == 0:
                        break
                    resample_inputs = np.array(sampler_inputs)[dupes].tolist()
                    new_outputs = self.sampler.sample(resample_inputs)
                    for i, output in zip(dupes, new_outputs):
                        outputs[i] = output
                if len(dupes) != 0 and options.verbosity >= 7:
                    print >> sys.stderr, "Unable to suppress duplicates for instances:"
                    for i in dupes:
                        print >> sys.stderr, "{}[{}] -> '{}'".format(
                            sampler_inputs[i].alt_inputs,
                            sampler_inputs[i].input, outputs[i])
            outputs = (np.array(outputs).reshape(
                len(batch), options.exhaustive_num_sample_sets,
                context_len * options.exhaustive_num_samples).tolist())

            return [
                instance.Instance(utt, j, alt_outputs=inst.alt_outputs)
                for inst, sample_sets in zip(batch, outputs)
                for samples in sample_sets
                for j in range(len(inst.alt_outputs))
                for utt in [inst.input] + samples
            ]
        else:
            return [
                instance.Instance(utt, j, alt_outputs=inst.alt_outputs)
                for inst in batch for j in range(len(inst.alt_outputs))
                for utt in [inst.input] + all_utts
            ]
Exemplo n.º 3
0
def evaluate_l1_eval():
    options = config.options(read=True)

    grids_path = os.path.join(options.run_dir, 's0_grids.0.jsons.gz')
    with gzip.open(grids_path, 'rb') as infile:
        grids = [json.loads(line.strip()) for line in infile]
    data_path = os.path.join(options.run_dir, 'data.eval.jsons')
    with open(data_path, 'r') as infile:
        insts = [
            instance.Instance(**json.loads(line.strip())) for line in infile
        ]

    assert len(grids) == len(insts), '{} != {}'.format(len(grids), len(insts))

    gold_outputs = np.array([inst.output for inst in insts])
    s0 = np.array([[np.array(ss['S0']).T for ss in grid['sets']]
                   for grid in grids])
    l1 = compute_l1(s0, alpha=options.alpha)
    l1_scores = l1[np.arange(l1.shape[0]), gold_outputs].tolist()
    l1_preds = np.argmax(l1, axis=1).tolist()

    m = [
        metrics.log_likelihood, metrics.log_likelihood_bits,
        metrics.perplexity, metrics.accuracy
    ]
    learner = DummyLearner(l1_preds, l1_scores)

    results = evaluate.evaluate(learner,
                                insts,
                                metrics=m,
                                split_id='l1_eval',
                                write_data=False)
    output.output_results(results, 'l1_eval')
Exemplo n.º 4
0
    def run_listener(self,
                     listener_class=ListenerLearner,
                     cell='LSTM',
                     tensorboard=True):
        sys.argv = []
        options = config.options()
        options.train_iters = 2
        options.train_epochs = 3
        options.listener_cell = cell
        options.listener = True

        mo = MockOpen(TEST_DIR)
        mgfp = mock_get_file_path(TEST_DIR)
        with mock.patch('stanza.monitoring.summary.open', mo), \
                mock.patch('stanza.monitoring.summary.SummaryWriter', MockSummaryWriter), \
                mock.patch('stanza.research.config.open', mo), \
                mock.patch('stanza.research.config.get_file_path', mgfp):
            listener = listener_class()
            train_data = [instance.Instance('green', (0, 255, 0))]
            listener.train(train_data)
            predictions, scores = listener.predict_and_score(train_data)

        # predictions = [(123, 45, 67)]
        self.assertIsInstance(predictions, list)
        self.assertEqual(len(predictions), 1)
        self.assertEqual(len(predictions[0]), 3)
        self.assertIsInstance(predictions[0][0], Number)
        # scores = [123.456]
        self.assertIsInstance(scores, list)
        self.assertEqual(len(scores), 1)
        self.assertIsInstance(scores[0], float)

        if tensorboard:
            self.check_tensorboard(mo, mgfp, images=True)
Exemplo n.º 5
0
 def sample(self, num_samples):
     '''
     :return: a list of `num_samples` colors sampled uniformly in RGB space,
              but expressed as HSV triples.
     '''
     colors = self.sampler.unvectorize_all(np.zeros(num_samples, dtype=np.int32),
                                           random=True, hsv=True)
     return [instance.Instance(c) for c in colors]
Exemplo n.º 6
0
 def sample(self, num_samples=1):
     descs = super(AtomicUniformContextPrior,
                   self).sample(num_samples=num_samples)
     colors = self.uniform_colors.sample(num_samples)
     insts = [
         instance.Instance(d.input, c.input) for d, c in zip(descs, colors)
     ]
     return color_instances.reference_game(insts,
                                           color_instances.uniform,
                                           listener=True)
Exemplo n.º 7
0
 def sample(self, num_samples=1):
     indices = np.array([[
         sample(self.counts.get_value() * 1.0 / self.total.get_value())
         for _t in range(self.vec.max_len)
     ] for _s in range(num_samples)],
                        dtype=np.int32)
     return [
         instance.Instance(' '.join(strip_invalid_tokens(s)))
         for s in self.vec.unvectorize_all(indices)
     ]
Exemplo n.º 8
0
 def on_iter_end(self, step, writer):
     most_common = [desc for desc, count in self.word_counts.most_common(10)]
     insts = [instance.Instance(input=desc) for desc in most_common]
     xs, (y,) = self._data_to_arrays(insts, test=True)
     probs = self.model.predict(xs)
     for i, desc in enumerate(most_common):
         dist = probs[i, :]
         for image, channel in zip(self.color_vec.visualize_distribution(dist), '012'):
             writer.log_image(step, '%s/%s/%s' % (self.id, desc, channel), image)
     super(ListenerLearner, self).on_iter_end(step, writer)
Exemplo n.º 9
0
def write_metric_for_split(output, run_dir, split, metric_name):
    filename = '%s.%s.jsons' % (metric_name, split)
    learner = Learner()
    learner.num_params = output.results['%s.num_params' % split]
    metric_func = metrics.METRICS[metric_name]
    if output.data[0].keys() == ['error']:
        data_insts = []
    else:
        data_insts = (instance.Instance(**d) for d in output.data)
    metric_scores = metric_func(data_insts, output.predictions, output.scores,
                                learner)
    config.dump(metric_scores, filename, lines=True)
Exemplo n.º 10
0
 def get_context_speaker_utts(self, base_samples):
     from fields import get_context
     contexts = [get_context(inst, self.options.listener) for inst in base_samples]
     context_insts = [instance.Instance(c, None)
                      for context in contexts
                      for c in context]
     utts = self.speaker_model.predict(context_insts, random=True)
     grouped_utts = []
     utt_iter = iter(utts)
     for context in contexts:
         grouped_utts.append([next(utt_iter) for _ in range(len(context))])
     return grouped_utts
Exemplo n.º 11
0
def get_trial_data(dir_output, size, tag):
    try:
        use_source = 'alt_inputs' in dir_output.data[0]['source']
    except (ValueError, KeyError):
        use_source = False
    src = lambda inst: (inst['source'] if use_source else inst)
    return [
        instance.Instance(pred,
                          src(inst)['input'],
                          alt_outputs=src(inst)['alt_inputs'],
                          source=tag) for inst, pred in
        zip(dir_output.data[:size], dir_output.predictions[:size])
    ]
Exemplo n.º 12
0
def build_insts(orig_inst, grid):
    # num_sample_sets * context_len * num_alt_utts
    num_sample_sets = len(grid['sets'])
    context_len = len(orig_inst['alt_outputs'])
    num_alt_utts = len(grid['sets'][0]['utts'])

    new_insts = []
    for s, ss in enumerate(grid['sets']):
        for t in range(len(orig_inst['alt_outputs'])):
            for u, utt in enumerate(ss['utts']):
                new_insts.append(
                    instance.Instance(input=t,
                                      alt_inputs=orig_inst['alt_outputs'],
                                      output=utt))
    return new_insts, (num_sample_sets, context_len, num_alt_utts)
Exemplo n.º 13
0
    def run_speaker(self,
                    speaker_class,
                    cell='LSTM',
                    color_repr='buckets',
                    tensorboard=True,
                    images=False):
        sys.argv = []
        options = config.options()
        options.train_iters = 2
        options.train_epochs = 3
        options.speaker_cell = cell
        options.speaker_color_repr = color_repr
        options.listener = False

        mo = MockOpen(TEST_DIR)
        mgfp = mock_get_file_path(TEST_DIR)
        with mock.patch('stanza.monitoring.summary.open', mo), \
                mock.patch('stanza.monitoring.summary.SummaryWriter', MockSummaryWriter), \
                mock.patch('stanza.research.config.open', mo), \
                mock.patch('stanza.research.config.get_file_path', mgfp):
            speaker = speaker_class()
            train_data = [instance.Instance((0, 255, 0), 'green')]
            speaker.train(train_data)
            predictions, scores = speaker.predict_and_score(train_data)

        # predictions = ['somestring']
        self.assertIsInstance(predictions, list)
        self.assertEqual(len(predictions), 1)
        self.assertIsInstance(predictions[0], basestring)
        # scores = [123.456]
        self.assertIsInstance(scores, list)
        self.assertEqual(len(scores), 1)
        self.assertIsInstance(scores[0], float)

        if tensorboard:
            self.check_tensorboard(mo, mgfp, images=images)
Exemplo n.º 14
0
def evaluate_ak_blending():
    options = config.options(read=True)

    grids_path = os.path.join(options.run_dir, 's0_grids.0.jsons.gz')
    with gzip.open(grids_path, 'rb') as infile:
        grids = [json.loads(line.strip()) for line in infile]
    data_path = os.path.join(options.run_dir, 'data.eval.jsons')
    with open(data_path, 'r') as infile:
        insts = [
            instance.Instance(**json.loads(line.strip())) for line in infile
        ]

    assert len(grids) == len(insts), '{} != {}'.format(len(grids), len(insts))

    gold_outputs = np.array([inst.output for inst in insts])
    l0 = np.array([[np.array(ss['L0']).T for ss in grid['sets']]
                   for grid in grids])
    s0 = np.array([[np.array(ss['S0']).T for ss in grid['sets']]
                   for grid in grids])
    if options.additive:
        ak = compute_additive(l0,
                              s0,
                              bw=options.base_weight,
                              sw=options.speaker_weight,
                              alpha_s1=options.alpha,
                              alpha_l1=options.alpha_l1)
    else:
        ak = compute_ak(l0,
                        s0,
                        bw=options.base_weight,
                        sw=options.speaker_weight,
                        alpha=options.alpha,
                        gamma=options.gamma)
    ak_scores = ak[np.arange(ak.shape[0]), gold_outputs].tolist()
    ak_preds = np.argmax(ak, axis=1).tolist()

    m = [
        metrics.log_likelihood, metrics.log_likelihood_bits,
        metrics.perplexity, metrics.accuracy
    ]
    learner = DummyLearner(ak_preds,
                           ak_scores,
                           params={
                               'base_weight': options.base_weight,
                               'speaker_weight': options.speaker_weight,
                               'alpha': options.alpha,
                               'alpha_l1': options.alpha_l1,
                               'gamma': options.gamma,
                               'additive': options.additive,
                           })

    split_id = '{}_eval'.format(options.blend_name)
    results = evaluate.evaluate(learner,
                                insts,
                                metrics=m,
                                split_id=split_id,
                                write_data=False)

    output.output_results(results, split_id)

    options_dump = vars(options)
    del options_dump['overwrite']
    del options_dump['config']
    config.dump_pretty(options_dump, split_id + '_config.json')
Exemplo n.º 15
0
 def get_reprs(self, utts):
     insts = [instance.Instance(utt, 0, alt_outputs=[(0, 0, 0)] * 3)
              for utt in utts]
     xs, (_,) = self._data_to_arrays(insts, test=True)
     return self.repr_fn(*xs)
Exemplo n.º 16
0
    def predict_and_score(self, eval_instances, random=False, verbosity=0):
        options = config.options()
        predictions = []
        scores = []

        all_utts = self.base.seq_vec.tokens
        sym_vec = vectorizers.SymbolVectorizer()
        sym_vec.add_all(all_utts)
        prior_scores = self.prior_scores(all_utts)

        base_is_listener = (type(self.base) in listener.LISTENERS.values())

        true_batch_size = options.listener_eval_batch_size / len(all_utts)
        batches = iterators.iter_batches(eval_instances, true_batch_size)
        num_batches = (len(eval_instances) - 1) // true_batch_size + 1

        if options.verbosity + verbosity >= 2:
            print('Testing')
        progress.start_task('Eval batch', num_batches)
        for batch_num, batch in enumerate(batches):
            progress.progress(batch_num)
            batch = list(batch)
            context = len(
                batch[0].alt_inputs) if batch[0].alt_inputs is not None else 0
            if context:
                output_grid = [
                    (instance.Instance(utt, color)
                     if base_is_listener else instance.Instance(color, utt))
                    for inst in batch for color in inst.alt_inputs
                    for utt in sym_vec.tokens
                ]
                assert len(output_grid) == context * len(batch) * len(all_utts), \
                    'Context must be the same number of colors for all examples'
                true_indices = np.array([inst.input for inst in batch])
            else:
                output_grid = [
                    (instance.Instance(utt, inst.input) if base_is_listener
                     else instance.Instance(inst.input, utt)) for inst in batch
                    for utt in sym_vec.tokens
                ]
                true_indices = sym_vec.vectorize_all(
                    [inst.input for inst in batch])
                if len(true_indices.shape) == 2:
                    # Sequence vectorizer; we're only using single tokens for now.
                    true_indices = true_indices[:, 0]
            scores = self.base.score(output_grid, verbosity=verbosity)
            if context:
                log_probs = np.array(scores).reshape(
                    (len(batch), context, len(all_utts)))
                orig_log_probs = log_probs[np.arange(len(batch)),
                                           true_indices, :]
                # Renormalize over only the context colors, and extract the score of
                # the true color.
                log_probs -= logsumexp(log_probs, axis=1)[:, np.newaxis, :]
                log_probs = log_probs[np.arange(len(batch)), true_indices, :]
            else:
                log_probs = np.array(scores).reshape(
                    (len(batch), len(all_utts)))
                orig_log_probs = log_probs
            assert log_probs.shape == (len(batch), len(all_utts))
            # Add in the prior scores, if used (S1 \propto L0 * P)
            if prior_scores is not None:
                log_probs = log_probs + 0.5 * prior_scores
            if options.exhaustive_base_weight:
                w = options.exhaustive_base_weight
                log_probs = w * orig_log_probs + (1.0 - w) * log_probs
            # Normalize across utterances. Note that the listener returns probability
            # densities over colors.
            log_probs -= logsumexp(log_probs, axis=1)[:, np.newaxis]
            if random:
                pred_indices = sample(np.exp(log_probs))
            else:
                pred_indices = np.argmax(log_probs, axis=1)
            predictions.extend(sym_vec.unvectorize_all(pred_indices))
            scores.extend(log_probs[np.arange(len(batch)),
                                    true_indices].tolist())
        progress.end_task()

        return predictions, scores
Exemplo n.º 17
0
 def get_gaussian_params(self, utt):
     inst = instance.Instance(utt, 0, alt_outputs=[(0, 0, 0)] * 3)
     xs, (_,) = self._data_to_arrays([inst], test=True)
     mean, covar, points, scores = self.gaussian_fn(*xs)
     return mean[0], covar[0]
Exemplo n.º 18
0
def get_trial_data(dir_output, size, tag):
    return [
        instance.Instance(pred, inst['input'], source=tag) for inst, pred in
        zip(dir_output.data[:size], dir_output.predictions[:size])
    ]
Exemplo n.º 19
0
def build_instance(utt, target, context, listener):
    if listener:
        return instance.Instance(utt, target, alt_outputs=context)
    else:
        return instance.Instance(target, utt, alt_inputs=context)
Exemplo n.º 20
0
 def sample(self, num_samples=1):
     indices = random.randint(0, self.vec.num_types, size=(num_samples, ))
     return [
         instance.Instance(c) for c in self.vec.unvectorize_all(indices)
     ]
Exemplo n.º 21
0
 def sample(self, num_samples=1):
     colors = super(UniformContextPrior, self).sample(num_samples)
     insts = [instance.Instance(c.input) for c in colors]
     return color_instances.reference_game(insts,
                                           color_instances.uniform_int,
                                           listener=False)