Beispiel #1
0
def main():
    parser = argparse.ArgumentParser("Generation demo.")
    parser.add_argument("src_vocab", type=Path)
    parser.add_argument("tgt_vocab", type=Path)
    parser.add_argument("checkpoint_dir", type=Path)
    args = parser.parse_args()

    source_vocab = plum.load(args.src_vocab)
    target_vocab = plum.load(args.tgt_vocab)
    model = load_model(args.checkpoint_dir)

    input_example = [
        "<sos>", "EATTYPE_N/A", "NEAR_Crowne_Plaza_Hotel", "AREA_city_centre",
        "FAMILYFRIENDLY_no", "CUSTOMERRATING_N/A", "PRICERANGE_N/A",
        "FOOD_N/A", "NAME_Browns_Cambridge", "<eos>"
    ]

    encoder_inputs = {"source_inputs": seq2tsr(input_example, source_vocab)}
    encoder_state = model.encode(encoder_inputs)

    print("Greedy Decoding")
    print("===============")
    print()
    greedy_search = GreedySearch(max_steps=100, vocab=target_vocab)
    greedy_search(model.decoder, encoder_state)
    for out in greedy_search.output():
        print(" ".join(out))
    print()

    print("Beam Decoding (beam size=8, showing top 3)")
    print("==========================================")
    print()
    beam_search = BeamSearch(max_steps=100, vocab=target_vocab, beam_size=10)
    beam_search(model.decoder, encoder_state)
    for out in beam_search.output(n_best=3)[0]:
        print(" ".join(out))
    print()

    print("Ancestral Sampling (samples=10, showing top 3)")
    print("==============================================")
    print()
    ancestral_sampler = AncestralSampler(max_steps=100,
                                         vocab=target_vocab,
                                         samples=10)
    ancestral_sampler(model.decoder, encoder_state)
    for out in ancestral_sampler.output(n_best=3)[0]:
        print(" ".join(out))
    print()

    print("Noise Injection Sampling (samples=10, showing top 3)")
    print("====================================================")
    print()
    npad_search = GreedyNPAD(max_steps=100,
                             vocab=target_vocab,
                             samples=10,
                             std=1.0)
    npad_search(model.decoder, encoder_state)
    for out in npad_search.output(n_best=3)[0]:
        print(" ".join(out))
    print()
Beispiel #2
0
    def run(self, env, verbose=False):

        output_path = env["proj_dir"] / "output" / self.filename
        output_path.parent.mkdir(exist_ok=True, parents=True)

        if self.checkpoint is None:
            ckpt = self._get_default_checkpoint(env)
        else:
            ckpt = self.checkpoint
        if ckpt is None:
            raise RuntimeError("No checkpoints found!")

        ckpt_path = env["checkpoints"][ckpt]["path"]
        if verbose:
            print("Loading model from {}".format(ckpt_path))
        model = plum.load(ckpt_path).eval()
        if env["gpu"] > -1:
            model.cuda(env["gpu"])
        self._gpu = env["gpu"]

        with open(self.input_path, 'r') as fp, \
                open(output_path, "w") as out_fp:
            for line in fp:

                data = json.loads(line)
                gen_input = self.make_generator_inputs(data)
                tokens, text = self._get_outputs(model, gen_input)
                data = json.dumps({
                    "mr": data["mr"],
                    "tokens": tokens,
                    "text": text,
                })
                print(data, file=out_fp, flush=True)
Beispiel #3
0
    def run(self, env, verbose=False):
        if self.checkpoint is None:
            ckpt = self._get_default_checkpoint(env)
        else:
            ckpt = self.checkpoint
        if ckpt is None:
            raise RuntimeError("No checkpoints found!")
        
        ckpt_path = env["checkpoints"][ckpt]["path"]
        if verbose:
            print("Reading checkpoint from {}".format(ckpt_path))
        model = plum.load(ckpt_path).eval()
        self.preflight_checks(model, env, verbose=verbose)

        if self.loss_function is not None:
            self.loss_function.reset()

        if self.metrics is not None:
            self.metrics.reset()

        self.reset_loggers(self.loggers)
        num_batches = len(self.batches)

        for step, batch in enumerate(self.batches, 1):
           
            forward_state = model(batch)
            if self.loss_function is not None:
                self.loss_function(forward_state, batch)
            if self.metrics is not None:
                self.metrics(forward_state, batch)
            self.apply_loggers(forward_state, batch, self.loggers)

            print("eval: {}/{} loss={:7.6f}".format(
                step, num_batches, self.loss_function.scalar_result()), 
                end="\r" if step < num_batches else "\n", flush=True)
        if self.metrics is not None:
            print(self.metrics.pretty_result())
        result = {
            "loss": {
                "combined": self.loss_function.scalar_result(),
                "detail": self.loss_function.compute(),
            },
            "metrics": self.valid_metrics.compute(),
        }
        
        self.log_results(result)
        print()

        self.close_loggers()
Beispiel #4
0
    def run(self, env, verbose=False):
        if self.checkpoint is None:
            ckpt = self._get_default_checkpoint(env)
        else:
            ckpt = self.checkpoint
        if ckpt is None:
            raise RuntimeError("No checkpoints found!")
        
        ckpt_path = env["checkpoints"][ckpt]["path"]
        if verbose:
            print("Reading checkpoint from {}".format(ckpt_path))
        model = plum.load(ckpt_path).eval()
        model.search_algos.update(self.searches)

        if env["gpu"] > -1:
            model.cuda(env["gpu"])
            self.batches.gpu = env["gpu"]
        
        if self.loss_function:
            self.loss_function.reset()

        if self.metrics:
            self.metrics.reset()

        for batch in self.batches:
            
            state = model(batch)
            
            if self.loss_function:
                self.loss_function(state, batch)
            
            if self.metrics:
                self.metrics(state, batch)
            
        print("loss")
        pprint(self.loss_function.compute())
        print()

        if self.metrics:
            print("metrics")
            pprint(self.metrics.compute())
            print()
    def run(self, env, verbose=False):

        output_path = env["proj_dir"] / "output" / self.filename
        output_path.parent.mkdir(exist_ok=True, parents=True)

        if self.checkpoint is None:
            ckpt = self._get_default_checkpoint(env)
        else:
            ckpt = self.checkpoint
        if ckpt is None:
            raise RuntimeError("No checkpoints found!")

        ckpt_path = env["checkpoints"][ckpt]["path"]
        if verbose:
            print("Loading model from {}".format(ckpt_path))
        model = plum.load(ckpt_path).eval()
        if env["gpu"] > -1:
            model.cuda(env["gpu"])
        self._gpu = env["gpu"]

        samples = self.make_samples()

        with open(output_path, "w") as out_fp:
            for i, mr in enumerate(samples, 1):
                print("{}/{}".format(i, len(samples)),
                      end="\r" if i < len(samples) else "\n",
                      flush=True)

                gen_input = self.make_generator_inputs(mr)

                tokens = self._get_outputs(model, gen_input)
                source = preproc.mr2source_inputs(mr)
                data = json.dumps({
                    "source": source,
                    "mr": mr,
                    "text": " ".join(tokens),
                })
                print(data, file=out_fp, flush=True)
Beispiel #6
0
    def run(self, env, verbose=False):
        ckpt, ckpt_md = self.get_checkpoint(env)

        if verbose:
            print("Reading checkpoint from {}".format(ckpt_md["path"]))
        model = plum.load(ckpt_md["path"]).eval()

        from plum.seq2seq.search import BeamSearch

        model.search_algos["beam"] = BeamSearch(
            max_steps=200,
            beam_size=4,
            vocab=model.search_algos["greedy"].vocab)

        if env["gpu"] > -1:
            if verbose:
                print("Placing model and batches on device {}".format(
                    env["gpu"]))
            model.cuda(env["gpu"])
            self.batches.gpu = env["gpu"]

        for batch in self.batches:
            state = model(batch)
            if self.reference_fields:
                refs = self.apply_fields(self.reference_fields, batch)
            else:
                refs = None
            pred = self.apply_fields(self.output_fields, state)
            outputs = pred.output()
            for i, output in enumerate(outputs):
                if refs:
                    if isinstance(refs[i], (list, tuple)):
                        print("\n".join(refs[i]))
                    else:
                        print(refs[i])
                print(postprocess(output))
                print()
Beispiel #7
0
 def __new__(cls, *args, **kwargs):
     path = kwargs["path"]
     return plum.load(path)
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("model", type=Path)
    parser.add_argument("size", type=int)
    parser.add_argument("train_mrs", type=Path)
    parser.add_argument("src_vocab", type=Path)
    parser.add_argument("tgt_vocab", type=Path)
    parser.add_argument("output", type=Path)
    parser.add_argument("--max-mr-sample", type=int, default=10000)
    parser.add_argument("--delex", action="store_true")
    parser.add_argument("--gpu", type=int, default=-1)
    parser.add_argument("--area-ckpts", type=Path)
    parser.add_argument("--area-vocab", type=Path)
    parser.add_argument("--eat-type-ckpts", type=Path)
    parser.add_argument("--eat-type-vocab", type=Path)
    parser.add_argument("--food-ckpts", type=Path)
    parser.add_argument("--food-vocab", type=Path)
    parser.add_argument("--family-friendly-ckpts", type=Path)
    parser.add_argument("--family-friendly-vocab", type=Path)
    parser.add_argument("--price-range-ckpts", type=Path)
    parser.add_argument("--price-range-vocab", type=Path)
    parser.add_argument("--customer-rating-ckpts", type=Path)
    parser.add_argument("--customer-rating-vocab", type=Path)
    args = parser.parse_args()

    args.output.parent.mkdir(exist_ok=True, parents=True)

    clfs = {
        "area": load_model(args.area_ckpts),  
        "eat_type": load_model(args.eat_type_ckpts),
        "food": load_model(args.food_ckpts),
        "family_friendly": load_model(args.family_friendly_ckpts),
        "price_range": load_model(args.price_range_ckpts),
        "customer_rating": load_model(args.customer_rating_ckpts),
    }
    
    label_vocabs = {
        "area": plum.load(args.area_vocab),
        "eat_type": plum.load(args.eat_type_vocab),
        "food": plum.load(args.food_vocab),
        "family_friendly": plum.load(args.family_friendly_vocab),
        "price_range": plum.load(args.price_range_vocab),
        "customer_rating": plum.load(args.customer_rating_vocab),
    }

    generator = load_model(args.model)
    if args.gpu > -1:
        generator.cuda(args.gpu)
        for m in clfs.values():
            m.cuda(args.gpu)
    src_vocab = plum.load(args.src_vocab)
    tgt_vocab = plum.load(args.tgt_vocab)
    counts, thresholds = count_fields(args.train_mrs, args.size)

    total_accepted = 0
    total_rejected = 0
    num_mr_samples = 0
    finish_round = False
    found = set()

    with args.output.open("w") as fp:
        while num_mr_samples < args.max_mr_sample and not finish_round:
            num_mr_samples += 1
            label_sample = draw_samples(counts[args.size], args.size)

            gen_inputs = make_generator_input(label_sample, src_vocab, 
                                              gpu=args.gpu)
            encoder_state = generator.encode(gen_inputs)
            search = plum.seq2seq.search.GreedyNPAD(
                max_steps=100, std=1.0, samples=200, vocab=tgt_vocab)
            search(generator.decoder, encoder_state)
            candidate_descriptions = search.output(n_best=20)[0]

            clf_input = search2inputs(candidate_descriptions, tgt_vocab,
                                      args.gpu)
            candidates = filter_candidates(candidate_descriptions, clf_input,
                                           clfs, label_vocabs)

            for desc, mr in candidates:
                pretty = postedit.detokenize(desc)

                if pretty in found:
                    total_rejected += 1
                    continue
                found.add(pretty)
                 
                data = {
                    "sequence": {
                        "mrs": labels2inputs(mr),
                        "tokens": desc[:-1]
                    },
                    "labels": mr, 
                }
                print(json.dumps(data), file=fp)

                total_accepted += 1
                pred_mr_size = count_active_fields(mr)
                
                for field, value in mr.items():
                    counts[pred_mr_size][field][value] += 1

            finish_round, num_complete, num_total = check_terminate(
                counts[args.size], thresholds[args.size])
             
            print("{} / {}  accept={} reject={} samples-this-round={}".format(
                    num_complete, num_total, total_accepted, total_rejected,
                    num_mr_samples),
                end="\r" if not finish_round else "\n", flush=True)
    print()

    print_counts(counts, thresholds, args.size)
def load_model(ckpt_dir):
    meta = json.loads((ckpt_dir / "ckpt.metadata.json").read_text())
    model_path = ckpt_dir / meta['optimal_checkpoint']
    return plum.load(model_path).eval()
    def run(self, env, verbose=False):

        output_path = env["proj_dir"] / "output" / self.filename
        output_path.parent.mkdir(exist_ok=True, parents=True)

        if self.checkpoint is None:
            ckpt = self._get_default_checkpoint(env)
        else:
            ckpt = self.checkpoint
        if ckpt is None:
            raise RuntimeError("No checkpoints found!")

        ckpt_path = env["checkpoints"][ckpt]["path"]
        if verbose:
            print("Loading model from {}".format(ckpt_path))
        model = plum.load(ckpt_path).eval()
        if env["gpu"] > -1:
            model.cuda(env["gpu"])
        self._gpu = env["gpu"]

        with output_path.open("w") as fp:

            field_subsets = self._field_subsets_iter(self.mr_size)
            for i, field_subset in enumerate(field_subsets, 1):
                print("slot subset {}/{}".format(i, self.total_subsets))
                if verbose:
                    print("    slots: {}".format(field_subset))

                total_mrs = self.total_settings(field_subset)

                batch = []
                inst_iter = self._instance_iter(field_subset)
                for j, labels in enumerate(inst_iter, 1):
                    print("setting {}/{}".format(j, total_mrs),
                          end="\r" if j < total_mrs else "\n",
                          flush=True)
                    batch.append(labels)
                    if len(batch) == self.batch_size:
                        output_tokens, output_strings = self._get_outputs(
                            model, batch)
                        for labels, tokens, string in zip(
                                batch, output_tokens, output_strings):
                            data = json.dumps({
                                "labels": labels,
                                "tokens": tokens,
                                "text": string
                            })
                            print(data, file=fp)
                        batch = []

                if len(batch) > 0:
                    output_tokens, output_strings = self._get_outputs(
                        model, batch)
                    for labels, tokens, string in zip(batch, output_tokens,
                                                      output_strings):
                        data = json.dumps({
                            "labels": labels,
                            "tokens": tokens,
                            "text": string
                        })
                        print(data, file=fp)
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("model", type=Path)
    parser.add_argument("size", type=int)
    parser.add_argument("train_mrs", type=Path)
    parser.add_argument("src_vocab", type=Path)
    parser.add_argument("tgt_vocab", type=Path)
    parser.add_argument("output", type=Path)
    parser.add_argument("--max-mr-sample", type=int, default=10000)
    parser.add_argument("--delex", action="store_true")
    parser.add_argument("--gpu", type=int, default=-1)

    args = parser.parse_args()

    args.output.parent.mkdir(exist_ok=True, parents=True)

    generator = load_model(args.model)
    if args.gpu > -1:
        generator.cuda(args.gpu)
    src_vocab = plum.load(args.src_vocab)
    tgt_vocab = plum.load(args.tgt_vocab)
    counts, thresholds = count_fields(args.train_mrs, args.size)

    total_accepted = 0
    total_rejected = 0
    num_mr_samples = 0
    finish_round = False
    found = set()

    with args.output.open("w") as fp:
        while num_mr_samples < args.max_mr_sample and not finish_round:
            num_mr_samples += 1
            label_sample = draw_samples(counts[args.size], args.size)

            gen_inputs = make_generator_input(label_sample,
                                              src_vocab,
                                              gpu=args.gpu)
            encoder_state = generator.encode(gen_inputs)
            search = plum.seq2seq.search.GreedyNPAD(max_steps=100,
                                                    std=1.0,
                                                    samples=200,
                                                    vocab=tgt_vocab)
            search(generator.decoder, encoder_state)
            candidate_descriptions = search.output(n_best=20)[0]

            for desc in candidate_descriptions:
                pretty = postedit.detokenize(desc)
                if pretty in found:
                    total_rejected += 1
                    continue
                if pretty.count("' ' '") > 0:
                    total_rejected += 1
                    continue
                pred_labels = rule_classify(pretty)
                if pred_labels["name"] is None:
                    total_rejected += 1
                    continue
                found.add(pretty)

                data = {
                    "sequence": {
                        "mrs": labels2inputs(pred_labels),
                        "tokens": desc[:-1]
                    },
                    "labels": pred_labels,
                }
                print(json.dumps(data), file=fp)

                #                print(label_sample)
                #                print(pretty)
                #                print({f: v for f, v in rule_classify(pretty).items()
                #                       if v != "N/A"})
                #                print()
                #                print(data)
                #                input()
                total_accepted += 1
                pred_mr_size = count_active_fields(pred_labels)

                for field, value in pred_labels.items():
                    #if value == "N/A":
                    #                    continue
                    counts[pred_mr_size][field][value] += 1

            finish_round, num_complete, num_total = check_terminate(
                counts[args.size], thresholds[args.size])

            print("{} / {}  accept={} reject={} samples-this-round={}".format(
                num_complete, num_total, total_accepted, total_rejected,
                num_mr_samples),
                  end="\r" if not finish_round else "\n",
                  flush=True)
    print()

    print_counts(counts, thresholds, args.size)