Esempio n. 1
0
def test():

    wdir = os.path.join(ROOT_DIR, 'weights')
    best_weight = os.path.join(wdir, 'best.pt')

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print(device)
    model = myModel()
    model.double()
    model.to(device)

    assert os.path.isdir(wdir), 'weight folder does not exist!'
    assert os.path.isfile(best_weight), 'the best weight file does not exist!'
    try:
        chkpt = torch.load(best_weight, map_location=device)
        print('best_fitness', chkpt['epoch'])
        model.load_state_dict(chkpt['model'])

        if chkpt.get('training_results') is not None:
            print(chkpt['training_results'])
        del chkpt
    except Exception:
        SystemExit('Error: Can not load pretrained model!')

    test_dataset = CommentDataset(TEST_DATASET, WORD2VEC_MODEL_FILE,
                                  MAX_LEN_FILE)

    test_loader = DataLoader(test_dataset,
                             batch_size=64,
                             num_workers=min(os.cpu_count(), 64),
                             shuffle=False)

    print('\n\nTesting...')
    model.eval()
    test_acc = 0
    y_true = []
    y_pred = []

    pbar = tqdm(enumerate(test_loader), total=len(test_loader))
    for i, (sentences, labels) in pbar:
        sentences = sentences.to(device)
        labels = labels.to(device)
        with torch.no_grad():
            preds = model(sentences)

            test_acc += (preds.argmax(1) == labels).sum().item()
            y_pred += preds.argmax(1).to('cpu').data.numpy().tolist()
            y_true += labels.to('cpu').data.numpy().tolist()

    y_pred = np.asarray(y_pred)
    y_true = np.asarray(y_true)
    s_test = "Acc: {:.3f}% || Precision: {:.3f} || Recall: {:.3f} || F1-score: {:.3f}".format(
        test_acc / len(test_dataset) * 100, precision_score(y_true, y_pred),
        recall_score(y_true, y_pred), f1_score(y_true, y_pred))
    print(s_test)
    with open('test_results.txt', 'w+') as f:
        f.write(s_test)

    torch.cuda.empty_cache()
def main():

    with torch.no_grad():
        model = myModel(pre_train_dir=args.pretrained_model_path,
                        dropout_rate=0.5).to(device)
        model.load_state_dict(torch.load(args.checkpoints))
        sentences, _ = load_data(args.test_path)
        with open('./output/result.json', 'w', encoding='utf-8') as f:
            for sent in tqdm(sentences):
                encode_dict = tokenizer.encode_plus(sent,
                                                    max_length=args.max_length,
                                                    pad_to_max_length=True)
                input_ids = encode_dict['input_ids']
                input_seg = encode_dict['token_type_ids']
                input_mask = encode_dict['attention_mask']

                input_ids = torch.Tensor([input_ids]).long()
                input_seg = torch.Tensor([input_seg]).long()
                input_mask = torch.Tensor([input_mask]).float()
                span_logits = model(input_ids=input_ids.to(device),
                                    input_mask=input_mask.to(device),
                                    input_seg=input_seg.to(device),
                                    is_training=False)

                span_logits = torch.argmax(span_logits, dim=-1)[0].to(
                    torch.device('cpu')).numpy().tolist()
                args_index = sapn_decode(span_logits)
                text_mapping = get_mapping(sent)
                entity_list = []

                for k in args_index:
                    try:
                        dv = 0
                        while text_mapping[k[0] - 1 + dv] == []:
                            dv += 1
                        start_split = text_mapping[k[0] - 1 + dv]

                        while text_mapping[k[1] - 1 + dv] == []:
                            dv += 1

                        end_split = text_mapping[k[1] - 1 + dv]

                        argument = sent[start_split[0]:end_split[-1] + 1]
                        entity_type = k[2]
                        entity_list.append({
                            'type': entity_type,
                            'argument': argument
                        })
                    except:
                        pass
                result = {'text': sent, 'entity_list': entity_list}
                json_data = json.dumps(result, ensure_ascii=False)
                f.write(json_data + '\n')
Esempio n. 3
0
def main():

    with torch.no_grad():
        model = myModel(pre_train_dir=args.pretrained_model_path,
                        dropout_rate=0.5).to(device)
        model.load_state_dict(torch.load(args.checkpoints))

        sentences = load_data(args.test_path)
        with open('./output/result.json', 'w', encoding='utf-8') as f:
            for sentence in tqdm(sentences):
                type_sent_list = [
                    entity_type + '[SEP]' + sentence
                    for entity_type in label2id.keys()
                ]
                input_ids = []
                input_seg = []
                input_mask = []
                for type_sent in type_sent_list:
                    encode_dict = tokenizer.encode_plus(
                        type_sent,
                        max_length=args.max_length,
                        pad_to_max_length=True)
                    input_ids.append(encode_dict['input_ids'])
                    input_seg.append(encode_dict['token_type_ids'])
                    input_mask.append(encode_dict['attention_mask'])
                input_ids = torch.Tensor(input_ids).long()
                input_seg = torch.Tensor(input_seg).long()
                input_mask = torch.Tensor(input_mask).float()
                start_logit, end_logit = model(
                    input_ids=input_ids.to(device),
                    input_mask=input_mask.to(device),
                    input_seg=input_seg.to(device),
                    is_training=False)
                start_logit = start_logit.to(
                    torch.device('cpu')).numpy().tolist()
                end_logit = end_logit.to(torch.device('cpu')).numpy().tolist()

                entity_list = []
                for i, type_sent in enumerate(type_sent_list):
                    text_start_id, text_end_id, text_mapping = get_actual_id(
                        sentence, type_sent)
                    args_dict = dict()
                    entity_type = type_sent.split('[SEP]')[0]

                    # args_index = get_start_end_i(start_logits[i],end_logits[i],span_logits[i],text_start_id,text_end_id)
                    args_index = extract_entity_from_start_end_ids(
                        start_logit[i], end_logit[i], text_start_id,
                        text_end_id)
                    # args_index=sapn_decode(span_logits[i])

                    for k in args_index:
                        tmp = {}
                        dv = 0
                        while text_mapping[k[0] - text_start_id + dv] == []:
                            dv += 1
                        start_split = text_mapping[k[0] - text_start_id + dv]

                        dv = 0
                        while text_mapping[k[1] - text_start_id + dv] == []:
                            dv -= 1
                        end_split = text_mapping[k[1] - text_start_id + dv]

                        tmp['type'] = entity_type
                        tmp['argument'] = sentence[start_split[0]:
                                                   end_split[-1] + 1]  #抽取实体
                        entity_list.append(tmp)
                result = {}
                result['text'] = sentence
                result['entity_list'] = entity_list

                json_data = json.dumps(result, ensure_ascii=False)
                f.write(json_data + '\n')
Esempio n. 4
0
def train(opts):
    epochs = opts.epochs
    batch_size = opts.batch_size

    init_seeds(42)
    wdir = os.path.join(ROOT_DIR, 'weights')
    if not opts.resume and not os.path.isdir(wdir):
        os.mkdir(wdir)

    best_weight = os.path.join(wdir, 'best.pt')
    last_weight = os.path.join(wdir, 'last.pt')

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model = myModel()
    model.double()
    model.to(device)
    optimizer = optim.SGD(model.parameters(), lr=opts.lr, momentum=opts.momentum, weight_decay=opts.weight_decay)
    criterion = nn.CrossEntropyLoss()

    start_epoch = 0
    best_fitness = 0
    if opts.resume:
        assert os.path.isdir(wdir), 'weight folder does not exist!'
        assert os.path.isfile(last_weight), 'the laster weight file does not exist!'
        try:
            chkpt = torch.load(last_weight, map_location=device)
            model.load_state_dict(chkpt['model'])

            if chkpt['optimizer'] is not None:
                optimizer.load_state_dict(chkpt['optimizer'])
            
            if chkpt.get('training_results') is not None:
                print(chkpt['training_results'])
            
            start_epoch = chkpt['epoch'] + 1
            del chkpt
        except Exception:
            SystemExit('Error: Can not load pretrained model!')
    
    scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[round(opts.epochs*x) for x in [0.8,0.9]], gamma=0.2)
    scheduler.last_epoch = start_epoch-1

    train_dataset = CommentDataset(TRAIN_DATASET,WORD2VEC_MODEL_FILE, MAX_LEN_FILE)
    val_dataset = CommentDataset(VAL_DATASET, WORD2VEC_MODEL_FILE, MAX_LEN_FILE)

    train_loader = DataLoader(train_dataset, batch_size=batch_size, num_workers=min(os.cpu_count(), batch_size), shuffle=False, pin_memory=True)
    val_loader = DataLoader(val_dataset, batch_size=64, num_workers=min(os.cpu_count(), batch_size), shuffle=False, pin_memory=True)

    for epoch in range(start_epoch, epochs):
        save_best = False
        
        model.train()
        train_loss = 0 
        train_acc = 0    
        print('\n\nTraining...')
        pbar = tqdm(enumerate(train_loader), total=len(train_loader))
        for i, (sentences, labels) in pbar:
            sentences = sentences.to(device)
            labels = labels.to(device)
            
            optimizer.zero_grad()


            preds = model(sentences)
            loss = criterion(preds, labels)

            loss.backward()
            optimizer.step()

            train_loss += loss.item()
            train_acc += (preds.argmax(1) == labels).sum().item()

        s_train = "Epoch: {} || Train Loss: {:.6f} ".format(
            epoch+1, train_loss/len(train_dataset))

        pbar.set_description(s_train)
        print(s_train)

        print('\n\nValidating...')
        model.eval()
        val_loss = 0
        val_acc = 0
        for (sentences,labels) in val_loader:
            sentences = sentences.to(device)
            labels = labels.to(device)
            with torch.no_grad():
                preds = model(sentences)
                loss = criterion(preds, labels)
                val_loss += loss.item()
                val_acc += (preds.argmax(1) == labels).sum().item()
        s_val = "Epoch: {} || Val Loss: {:.6f} || Val Acc: {:.3f} ".format(
            epoch+1, val_loss/len(val_dataset), val_acc/len(val_dataset))
        print(s_val)
        if best_fitness < val_acc:
            save_best = True
            print('Saving...')
            best_fitness = val_acc
            chkpt = {'epoch':epoch, 
                     'best_fitness':best_fitness,
                     'model': model.state_dict(),
                     'optimizer': optimizer.state_dict()
                    }
            torch.save(chkpt,best_weight)

            del chkpt
        
        if epoch > 0:
            scheduler.step()

        if opts.save_result:
            with open('train_result.txt', 'a+') as f:
                f.write(s_train + '\n')
                if save_best:
                    f.write('Saved at:\n')
                f.write(s_val + '\n\n')

    torch.cuda.empty_cache()
Esempio n. 5
0
def train():
    train_data = data_prepro.yield_data(args.train_path)
    test_data = data_prepro.yield_data(args.test_path)

    model = myModel(pre_train_dir=args.pretrained_model_path,
                    dropout_rate=0.5).to(device)
    # model.load_state_dict(torch.load(args.checkpoints))
    param_optimizer = list(model.named_parameters())
    no_decay = ['bias', 'gamma', 'beta']
    optimizer_grouped_parameters = [{
        'params':
        [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)],
        'weight_decay_rate':
        0.01
    }, {
        'params':
        [p for n, p in param_optimizer if any(nd in n for nd in no_decay)],
        'weight_decay_rate':
        0.0
    }]
    optimizer = optim.AdamW(params=optimizer_grouped_parameters,
                            lr=args.learning_rate)

    schedule = WarmUp_LinearDecay(optimizer=optimizer,
                                  init_rate=args.learning_rate,
                                  warm_up_epoch=args.warm_up_epoch,
                                  decay_epoch=args.decay_epoch)

    span_loss_func = span_loss.Span_loss().to(device)
    span_acc = metrics.metrics_span().to(device)

    step = 0
    best = 0
    for epoch in range(args.epoch):
        for item in train_data:
            step += 1
            input_ids, input_mask, input_seg = item["input_ids"], item[
                "input_mask"], item["input_seg"]
            span_label, span_mask = item['span_label'], item["span_mask"]
            optimizer.zero_grad()
            span_logits = model(input_ids=input_ids.to(device),
                                input_mask=input_mask.to(device),
                                input_seg=input_seg.to(device),
                                is_training=True)
            span_loss_v = span_loss_func(span_logits, span_label.to(device),
                                         span_mask.to(device))
            loss = span_loss_v
            loss = loss.float().mean().type_as(loss)
            loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(),
                                           max_norm=args.clip_norm)
            schedule.step()
            # optimizer.step()
            if step % 100 == 0:
                span_logits = torch.nn.functional.softmax(span_logits, dim=-1)
                recall, precise, span_f1 = span_acc(span_logits,
                                                    span_label.to(device))
                logger.info(
                    'epoch %d, step %d, loss %.4f, recall %.4f, precise %.4f, span_f1 %.4f'
                    % (epoch, step, loss, recall, precise, span_f1))
        with torch.no_grad():
            count = 0
            span_f1 = 0
            recall = 0
            precise = 0

            for item in test_data:
                count += 1
                input_ids, input_mask, input_seg = item["input_ids"], item[
                    "input_mask"], item["input_seg"]
                span_label, span_mask = item['span_label'], item["span_mask"]

                optimizer.zero_grad()
                span_logits = model(input_ids=input_ids.to(device),
                                    input_mask=input_mask.to(device),
                                    input_seg=input_seg.to(device),
                                    is_training=False)
                tmp_recall, tmp_precise, tmp_span_f1 = span_acc(
                    span_logits, span_label.to(device))
                span_f1 += tmp_span_f1
                recall += tmp_recall
                precise += tmp_precise

            span_f1 = span_f1 / count
            recall = recall / count
            precise = precise / count

            logger.info('-----eval----')
            logger.info(
                'epoch %d, step %d, loss %.4f, recall %.4f, precise %.4f, span_f1 %.4f'
                % (epoch, step, loss, recall, precise, span_f1))
            logger.info('-----eval----')
            if best < span_f1:
                best = span_f1
                torch.save(model.state_dict(), f=args.checkpoints)
                logger.info('-----save the best model----')
Esempio n. 6
0
def train():
    train_data = data_prepro.yield_data(args.train_path)
    test_data = data_prepro.yield_data(args.test_path)

    model = myModel(pre_train_dir=args.pretrained_model_path, dropout_rate=0.5).to(device)
    # model.load_state_dict(torch.load(args.checkpoints))
    param_optimizer = list(model.named_parameters())
    no_decay = ['bias', 'gamma', 'beta']
    optimizer_grouped_parameters = [
        {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)],
            'weight_decay_rate': 0.01},
        {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)],
            'weight_decay_rate': 0.0}
    ]
    optimizer = optim.AdamW(params=optimizer_grouped_parameters, lr=args.learning_rate)

    schedule = WarmUp_LinearDecay(
                optimizer = optimizer, 
                init_rate = args.learning_rate,
                 warm_up_epoch = args.warm_up_epoch,
                decay_epoch = args.decay_epoch
            )
    
    loss_func = cross_entropy_loss.cross_entropy().to(device)

    acc_func = metrics.metrics_func().to(device)
    # start_acc = metrics.metrics_start().to(device)
    # end_acc = metrics.metrics_end().to(device)

    step=0
    best=0
    for epoch in range(args.epoch):
        for item in train_data:
            step+=1
            input_ids, input_mask, input_seg = item["input_ids"], item["input_mask"], item["input_seg"]
            start_label ,end_label, span_label, seq_mask = item["start_label"],item["end_label"],item['span_label'],item["seq_mask"]
            seq_id = item["seq_id"]
            optimizer.zero_grad()
            start_logits,end_logits = model( 
                input_ids=input_ids.to(device), 
                input_mask=input_mask.to(device),
                input_seg=input_seg.to(device),
                is_training=True
            )
            start_end_loss = loss_func(start_logits,end_logits,start_label.to(device),end_label.to(device),seq_mask.to(device))
            loss = start_end_loss
            loss = loss.float().mean().type_as(loss)
            loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=args.clip_norm)
            schedule.step()
            # optimizer.step()
            if step%50 == 0:
                start_logits = torch.nn.functional.softmax(start_logits, dim=-1)
                end_logits = torch.nn.functional.softmax(end_logits, dim=-1)
                _,_,start_f1=acc_func(start_logits,start_label.to(device),seq_mask.to(device))
                _,_,end_f1=acc_func(end_logits,end_label.to(device),seq_mask.to(device))

                logger.info('epoch %d, step %d, loss %.4f, start_f1 %.4f, end_f1 %.4f'% (
                    epoch,step,loss,start_f1,end_f1))
        
        with torch.no_grad():

            start_f1=0
            end_f1=0
            count=0
            flag_f1=0

            for item in test_data:
                input_ids, input_mask, input_seg = item["input_ids"], item["input_mask"], item["input_seg"]
                start_label,end_label,span_label,seq_mask = item["start_label"],item["end_label"],item['span_label'],item["seq_mask"]
                seq_id = item["seq_id"]
                optimizer.zero_grad()
                start_logits,end_logits = model( 
                    input_ids=input_ids.to(device), 
                    input_mask=input_mask.to(device),
                    input_seg=input_seg.to(device),
                    is_training=False
                    ) 
                _,_,tmp_f1_start=acc_func(start_logits,start_label.to(device),seq_mask.to(device))
                start_f1+=tmp_f1_start

                _,_,tmp_f1_end=acc_func(end_logits,end_label.to(device),seq_mask.to(device))
                end_f1+=tmp_f1_end
                count+=1

            start_f1=start_f1/count
            end_f1=end_f1/count

            logger.info('-----eval----')
            logger.info('epoch %d, step %d, loss %.4f, start_f1 %.4f, end_f1 %.4f'% (
                    epoch,step,loss,start_f1,end_f1))
            logger.info('-----eval----')
            if best < start_f1+end_f1:
                best=start_f1+end_f1
                torch.save(model.state_dict(), f=args.checkpoints)
                logger.info('-----save the best model----')
def train():
    train_data = data_prepro.yield_data(args.train_path)
    test_data = data_prepro.yield_data(args.test_path)

    model = myModel(pre_train_dir=args.pretrained_model_path,
                    dropout_rate=0.5).to(device)
    # model.load_state_dict(torch.load(args.checkpoints),False)

    no_decay = ["bias", "LayerNorm.weight"]
    param_optimizer = list(model.named_parameters())
    optimizer_grouped_parameters = [{
        'params':
        [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)],
        'weight_decay_rate':
        0.01
    }, {
        'params':
        [p for n, p in param_optimizer if any(nd in n for nd in no_decay)],
        'weight_decay_rate':
        0.0
    }]

    optimizer = optim.AdamW(params=optimizer_grouped_parameters,
                            lr=args.learning_rate)
    schedule = WarmUp_LinearDecay(optimizer=optimizer,
                                  init_rate=args.learning_rate,
                                  warm_up_epoch=args.warm_up_epoch,
                                  decay_epoch=args.decay_epoch)

    acc_func = metrics.metrics_func().to(device)
    step = 0
    best_f1 = 0
    for epoch in range(args.epoch):
        for item in train_data:
            step += 1
            input_ids, input_mask, input_seg = item["input_ids"], item[
                "input_mask"], item["input_seg"]
            labels = item["labels"]
            token_word = item["token_word"]

            optimizer.zero_grad()
            loss, logits = model(input_ids=input_ids.to(device),
                                 input_mask=input_mask.to(device),
                                 input_seg=input_seg.to(device),
                                 token_word=token_word.to(device),
                                 labels=labels)

            loss = loss.float().mean().type_as(loss)
            loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(),
                                           max_norm=args.clip_norm)
            schedule.step()

            if step % 100 == 0:
                recall, precise, f1 = acc_func(logits, labels.to(device))
                logger.info(
                    'epoch %d, step %d, loss %.4f, recall %.4f, precise %.4f, f1 %.4f'
                    % (epoch, step, loss, recall, precise, f1))

        with torch.no_grad():
            recall = 0
            precise = 0
            f1 = 0
            count = 0
            for item in test_data:
                count += 1
                input_ids, input_mask, input_seg = item["input_ids"], item[
                    "input_mask"], item["input_seg"]
                labels = item["labels"]
                token_word = item["token_word"]

                loss, logits = model(input_ids=input_ids.to(device),
                                     input_mask=input_mask.to(device),
                                     input_seg=input_seg.to(device),
                                     token_word=token_word.to(device),
                                     labels=labels)
                tmp_recall, tmp_precise, tmp_f1 = acc_func(
                    logits, labels.to(device))
                recall += tmp_recall
                precise += tmp_precise
                f1 += tmp_f1

            recall = recall / count
            precise = precise / count
            f1 = f1 / count

            logger.info('-----eval----')
            logger.info(
                'epoch %d, step %d, loss %.4f, recall %.4f, precise %.4f, f1 %.4f'
                % (epoch, step, loss, recall, precise, f1))
            logger.info('-----eval----')
            if best_f1 < f1:
                best_f1 = f1
                torch.save(model.state_dict(), f=args.checkpoints)
                logger.info('-----save the best model----')