예제 #1
0
def train_model():
    train_dataset = torch.load(
        os.path.join(paths.experiment_data_dir, 'train.data'))
    dev_dataset = torch.load(
        os.path.join(paths.experiment_data_dir, 'dev.data'))
    test_dataset = torch.load(
        os.path.join(paths.experiment_data_dir, 'test.data'))
    vocab = torch.load(paths.vocab_path)
    model = RelationClassifier(encoder_type=args.encoder,
                               num_classes=len(train_dataset.label_map),
                               vocab_size=vocab.size(),
                               embed_dim=vocab.embed_dim,
                               model_config=ModelConfig,
                               drop_rate=args.drop,
                               use_cuda=args.cuda,
                               attention=args.attention)
    # init with pre-trained embeddings
    model.argument_encoder.emb.weight.data.copy_(vocab.embeddings)
    # model.argument_encoder.emb.weight.requires_grad = False
    criterion = nn.CrossEntropyLoss()
    params_to_train = filter(lambda p: p.requires_grad, model.parameters())
    if args.cuda:
        model.cuda(), criterion.cuda()
    if args.optim == 'sgd':
        optimizer = optim.SGD(params_to_train,
                              lr=args.lr,
                              weight_decay=args.wd)
    elif args.optim == 'adam':
        optimizer = optim.Adam(params_to_train,
                               lr=args.lr,
                               weight_decay=args.wd)
    elif args.optim == 'adagrad':
        optimizer = optim.Adagrad(params_to_train,
                                  lr=args.lr,
                                  weight_decay=args.wd)
    elif args.optim == 'rprop':
        optimizer = optim.Rprop(params_to_train, lr=args.lr)
    trainer = Trainer(model, criterion, optimizer, args.cuda)
    best_dev_acc = 0
    for epoch in range(args.epochs):
        print()
        trainer.train(train_dataset, vocab, batch_size=args.batch_size)
        # train_loss, train_acc, train_f1 = trainer.eval(train_dataset, vocab, 'trainset')
        # print('Train: loss {}, acc {}, f1 {}'.format(train_loss, train_acc, train_f1))
        dev_acc = trainer.eval(dev_dataset, vocab, 'devset')
        print('Dev: acc {}'.format(dev_acc))
        test_acc = trainer.eval(test_dataset, vocab, 'testset')
        print('Test: acc {}'.format(test_acc))
        if dev_acc > best_dev_acc:
            best_dev_acc = dev_acc
            print('Model saved to {}'.format(paths.best_model_path))
            torch.save(model.state_dict(), paths.best_model_path)
예제 #2
0
def test_model():
    train_dataset = torch.load(
        os.path.join(paths.experiment_data_dir, 'train.data'))
    dev_dataset = torch.load(
        os.path.join(paths.experiment_data_dir, 'dev.data'))
    test_dataset = torch.load(
        os.path.join(paths.experiment_data_dir, 'test.data'))
    vocab = torch.load(paths.vocab_path)
    model = RelationClassifier(encoder_type=args.encoder,
                               num_classes=len(train_dataset.label_map),
                               vocab_size=vocab.size(),
                               embed_dim=vocab.embed_dim,
                               model_config=ModelConfig,
                               drop_rate=args.drop,
                               use_cuda=args.cuda)
    model.load_state_dict(torch.load(paths.best_model_path))
    trainer = Trainer(model, use_cuda=args.cuda)
    # train_loss, train_acc, train_f1 = trainer.eval(train_dataset, vocab, 'trainset')
    # print('Train: loss {}, acc {}, f1 {}'.format(train_loss, train_acc, train_f1))
    dev_acc = trainer.eval(dev_dataset, vocab, 'devset')
    print('Dev: acc {}'.format(dev_acc))
    test_acc = trainer.eval(test_dataset, vocab, 'testset')
    print('Test: acc {}'.format(test_acc))