Exemplo n.º 1
0
def train():
    if not os.path.exists('train_model/'):
        os.makedirs('train_model/')
    if not os.path.exists('result/'):
        os.makedirs('result/')

    train_data, dev_data, word2id, id2word, char2id, opts = load_data(
        vars(args))
    model = UNet(opts)

    if args.use_cuda:
        model = model.cuda()

    dev_batches = get_batches(dev_data, args.batch_size, evaluation=True)

    if args.eval:
        print('load model...')
        model.load_state_dict(torch.load(args.model_dir))
        model.eval()
        model.Evaluate(dev_batches,
                       args.data_path + 'dev_eval.json',
                       answer_file='result/' + args.model_dir.split('/')[-1] +
                       '.answers',
                       drop_file=args.data_path + 'drop.json',
                       dev=args.data_path + 'dev-v2.0.json')
        exit()

    if args.load_model:
        print('load model...')
        model.load_state_dict(torch.load(args.model_dir))
        model.eval()
        _, F1 = model.Evaluate(dev_batches,
                               args.data_path + 'dev_eval.json',
                               answer_file='result/' +
                               args.model_dir.split('/')[-1] + '.answers',
                               drop_file=args.data_path + 'drop.json',
                               dev=args.data_path + 'dev-v2.0.json')
        best_score = F1
        with open(args.model_dir + '_f1_scores.pkl', 'rb') as f:
            f1_scores = pkl.load(f)
        with open(args.model_dir + '_em_scores.pkl', 'rb') as f:
            em_scores = pkl.load(f)
    else:
        best_score = 0.0
        f1_scores = []
        em_scores = []

    parameters = filter(lambda p: p.requires_grad, model.parameters())
    optimizer = torch.optim.Adamax(parameters, lr=args.lrate)

    lrate = args.lrate

    for epoch in range(1, args.epochs + 1):
        train_batches = get_batches(train_data, args.batch_size)
        dev_batches = get_batches(dev_data, args.batch_size, evaluation=True)
        total_size = len(train_data) // args.batch_size

        model.train()
        for i, train_batch in enumerate(train_batches):
            loss = model(train_batch)
            model.zero_grad()
            optimizer.zero_grad()
            loss.backward()
            torch.nn.utils.clip_grad_norm_(parameters, opts['grad_clipping'])
            optimizer.step()
            model.reset_parameters()

            if i % 100 == 0:
                print(
                    'Epoch = %d, step = %d / %d, loss = %.5f, lrate = %.5f best_score = %.3f'
                    % (epoch, i, total_size, model.train_loss.value, lrate,
                       best_score))
                sys.stdout.flush()

        model.eval()
        exact_match_score, F1 = model.Evaluate(
            dev_batches,
            args.data_path + 'dev_eval.json',
            answer_file='result/' + args.model_dir.split('/')[-1] + '.answers',
            drop_file=args.data_path + 'drop.json',
            dev=args.data_path + 'dev-v2.0.json')
        f1_scores.append(F1)
        em_scores.append(exact_match_score)
        with open(args.model_dir + '_f1_scores.pkl', 'wb') as f:
            pkl.dump(f1_scores, f)
        with open(args.model_dir + '_em_scores.pkl', 'wb') as f:
            pkl.dump(em_scores, f)

        if best_score < F1:
            best_score = F1
            print('saving %s ...' % args.model_dir)
            torch.save(model.state_dict(), args.model_dir)
        if epoch > 0 and epoch % args.decay_period == 0:
            lrate *= args.decay
            for param_group in optimizer.param_groups:
                param_group['lr'] = lrate
Exemplo n.º 2
0
def train():
    if not os.path.exists("train_model/"):
        os.makedirs("train_model/")
    if not os.path.exists("result/"):
        os.makedirs("result/")

    train_data, dev_data, word2id, id2word, char2id, opts = load_data(
        vars(args))
    model = UNet(opts)

    if args.use_cuda:
        model = model.cuda()

    dev_batches = get_batches(dev_data, args.batch_size, evaluation=True)

    if args.eval:
        print("load model...")
        model.load_state_dict(torch.load(args.model_dir))
        model.eval()
        model.Evaluate(
            dev_batches,
            os.path.join(args.prepro_dir, "dev_eval.json"),
            answer_file="result/" + args.model_dir.split("/")[-1] + ".answers",
            drop_file=os.path.join(args.prepro_dir, "drop.json"),
            dev=args.dev_file,
        )
        exit()

    if args.load_model:
        print("load model...")
        model.load_state_dict(torch.load(args.model_dir))
        model.eval()
        _, F1 = model.Evaluate(
            dev_batches,
            os.path.join(args.prepro_dir, "dev_eval.json"),
            answer_file=os.path.join("result/",
                                     args.model_dir.split("/")[-1],
                                     ".answers"),
            drop_file=os.path.join(args.prepro_dir, "drop.json"),
            dev=args.dev_file,
        )
        best_score = F1
        with open(args.model_dir + "_f1_scores.pkl", "rb") as f:
            f1_scores = pkl.load(f)
        with open(args.model_dir + "_em_scores.pkl", "rb") as f:
            em_scores = pkl.load(f)
    else:
        best_score = 0.0
        f1_scores = []
        em_scores = []

    parameters = filter(lambda p: p.requires_grad, model.parameters())
    optimizer = torch.optim.Adamax(parameters, lr=args.lrate)

    lrate = args.lrate

    for epoch in range(1, args.epochs + 1):
        train_batches = get_batches(train_data, args.batch_size)
        dev_batches = get_batches(dev_data, args.batch_size, evaluation=True)
        total_size = len(train_data) // args.batch_size

        model.train()
        for i, train_batch in enumerate(train_batches):
            loss = model(train_batch)
            model.zero_grad()
            optimizer.zero_grad()
            loss.backward()
            torch.nn.utils.clip_grad_norm_(parameters, opts["grad_clipping"])
            optimizer.step()
            model.reset_parameters()

            if i % 100 == 0:
                print(
                    "Epoch = %d, step = %d / %d, loss = %.5f, lrate = %.5f best_score = %.3f"
                    % (epoch, i, total_size, model.train_loss.value, lrate,
                       best_score))
                sys.stdout.flush()

        model.eval()
        exact_match_score, F1 = model.Evaluate(
            dev_batches,
            os.path.join(args.prepro_dir, "dev_eval.json"),
            answer_file=os.path.join("result/",
                                     args.model_dir.split("/")[-1],
                                     ".answers"),
            drop_file=os.path.join(args.prepro_dir, "drop.json"),
            dev=args.dev_file,
        )
        f1_scores.append(F1)
        em_scores.append(exact_match_score)
        with open(args.model_dir + "_f1_scores.pkl", "wb") as f:
            pkl.dump(f1_scores, f)
        with open(args.model_dir + "_em_scores.pkl", "wb") as f:
            pkl.dump(em_scores, f)

        if best_score < F1:
            best_score = F1
            print("saving %s ..." % args.model_dir)
            torch.save(model.state_dict(), args.model_dir)
        if epoch > 0 and epoch % args.decay_period == 0:
            lrate *= args.decay
            for param_group in optimizer.param_groups:
                param_group["lr"] = lrate