Exemple #1
0
    # Getting the test data from pytorch

    dataset = SNLI(batch_size, device)
    out_dim = dataset.out_dim()
    vocab_size = dataset.vocabulary_size()

    # from google.colab import drive
    # drive.mount('/content/gdrive')
    
    # Testing the LSTM model

    # Loading the model using the parameters needed
    filename = "Models/LSTM/" + '{0}_{1}_{2}_{3}_{4}_{5}_{6}_bidirect.pt'.format(batch_size, embedding_dim, dropout_ratio, hidden_dim, epochs, opt_name, lr)
    model = BiLSTM(vocab_size, embedding_dim, dropout_ratio, hidden_dim, out_dim, bidirect)
    model.to(device)
    model.load_state_dict(torch.load(filename, map_location=torch.device('cpu')))

    test_loss, test_accuracy, gt, pred = test(model, dataset)
    # print("Test loss = {}, Test accuracy = {}".format(test_loss, test_accuracy))

    # Writing the output from LSTM onto a text file

    labels = ['entailment', 'contradiction', 'neutral']
    with open("LSTM.txt", 'w') as f:
        f.write("Loss on Test Data : {}\n".format(test_loss))
        f.write("Accuracy on Test Data : {}\n".format(test_accuracy))
        f.write("gt_label,pred_label \n")
        for idx in range(len(gt)):
            f.write("{},{}\n".format(labels[gt[idx]], labels[pred[idx]]))
Exemple #2
0
def main(config):
    trainDataPath = config['data']['trainDataPath']
    validDataPath = config['data']['validDataPath']
    testDataPath = config['data']['testDataPath']

    modelName = config['modelName']

    batchSize = config['model']['batchSize']
    epochNum = config['model']['epochNum']
    earlyStop = config['model']['earlyStop']
    learningRate = config['model']['learningRate']
    modelSavePath = config['model']['modelSavePath']

    #GPU/CPU
    DEVICE = config['DEVICE']

    trianDataset = NERDataset(trainDataPath, config)
    validDataset = NERDataset(validDataPath, config)
    testDataset = NERDataset(testDataPath, config)

    trainIter = data.DataLoader(dataset=trianDataset,
                                batch_size=batchSize,
                                shuffle=True,
                                num_workers=4,
                                collate_fn=pad)

    validIter = data.DataLoader(dataset=validDataset,
                                batch_size=batchSize,
                                shuffle=False,
                                num_workers=4,
                                collate_fn=pad)

    testIter = data.DataLoader(dataset=testDataset,
                               batch_size=batchSize,
                               shuffle=False,
                               num_workers=4,
                               collate_fn=pad)

    if modelName == 'bilstm':
        net = BiLSTM(config)
        train = bilstmTrain
        eval = bilstmEval
        if torch.cuda.device_count() > 1:
            net = nn.DataParallel(net)

    if modelName == 'bilstm_crf':
        net = BiLSTM_CRF(config)
        train = bilstmCRFTrain
        eval = bilstmCRFEval

    if modelName == 'transformer_crf':
        net = Transformer_CRF(config)
        train = transformerCRFTrain
        eval = transformerCRFEval

    if modelName == 'cnn':
        net = CNN(config)
        train = cnnTrain
        eval = cnnEval

    net = net.to(DEVICE)

    lossFunction = nn.NLLLoss()
    optimizer = optim.Adam(net.parameters(),
                           lr=learningRate,
                           betas=(0.9, 0.999),
                           eps=1e-08)

    earlyNumber, beforeLoss, maxScore = 0, sys.maxsize, -1

    #开始训练
    for epoch in range(epochNum):

        print('第%d次迭代: ' % epoch)

        totalLoss = train(net,
                          trainIter,
                          optimizer=optimizer,
                          criterion=lossFunction,
                          DEVICE=DEVICE)
        print('训练损失为: %f' % totalLoss)

        totalLoss, f1Score = eval(net,
                                  validIter,
                                  criterion=lossFunction,
                                  DEVICE=DEVICE)

        if f1Score > maxScore:
            maxScore = f1Score
            torch.save(net.state_dict(), modelSavePath)

        print('验证损失为:%f   f1Score:%f / %f' % (totalLoss, f1Score, maxScore))

        if f1Score < maxScore:
            earlyNumber += 1
            print('earyStop: %d/%d' % (earlyNumber, earlyStop))
        else:
            earlyNumber = 0
        if earlyNumber >= earlyStop: break
        print('\n')

    #加载最优模型
    net.load_state_dict(torch.load(modelSavePath))
    totalLoss, f1Score = eval(net,
                              testIter,
                              criterion=lossFunction,
                              DEVICE=DEVICE)
    print('测试损失为: %f, f1Score: %f' % (totalLoss, f1Score))
Exemple #3
0
def run(dataDir, fold=5):
    f = open('./config.yml', encoding='utf-8', errors='ignore')
    config = yaml.safe_load(f)
    DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    config['DEVICE'] = DEVICE
    batchSize = config['model']['batchSize']

    optParser = OptionParser()
    optParser.add_option('-m',
                         '--model',
                         action='store',
                         type='string',
                         dest='modelName')
    option, args = optParser.parse_args()
    modelName = config['modelName'] = option.modelName

    #保存最终结果
    f = open(os.path.join(dataDir, modelName, 'result.txt'),
             'w',
             encoding='utf-8',
             errors='ignore')

    #测试数据
    testDataPath = config['data']['testDataPath']
    testDataset = NERTestDataset(testDataPath, config)
    testIter = data.DataLoader(dataset=testDataset,
                               batch_size=batchSize,
                               shuffle=False,
                               num_workers=4,
                               collate_fn=testPad)

    for i in range(fold):
        print('--------------------第%d次验证-------------------\n' % (i + 1))
        #验证数据
        validDataset = NERDataset(os.path.join(dataDir,
                                               str(i) + '.txt'), config)
        validIter = data.DataLoader(dataset=validDataset,
                                    batch_size=batchSize,
                                    shuffle=False,
                                    num_workers=4,
                                    collate_fn=pad)
        #训练数据
        trainPathArr = [
            os.path.join(dataDir,
                         str(j) + '.txt') for j in range(fold) if j != i
        ]
        assert len(trainPathArr) == fold - 1

        trainDataset = NERDataset(trainPathArr, config)
        trainIter = data.DataLoader(dataset=trainDataset,
                                    batch_size=batchSize,
                                    shuffle=True,
                                    num_workers=4,
                                    collate_fn=pad)

        #加载网络
        if modelName == 'bilstm':
            net = BiLSTM(config)

        if modelName == 'idcnn':
            net = IDCNN(config)

        if modelName == 'bilstm_attn':
            net = BiLSTM_ATTN(config)

        if torch.cuda.device_count() > 1:
            net = nn.DataParallel(net)

        net = net.to(DEVICE)

        config['submitPath'] = os.path.join(dataDir, modelName,
                                            str(i) + '.csv')
        config['modelSavePath'] = os.path.join(dataDir, modelName,
                                               str(i) + '.pkl')

        trainLoss, validLoss, f1Score, accurate, recall = train(
            net, trainIter, validIter, config)

        #验证集中实际效果
        modelSavePath = config['modelSavePath']
        if os.path.exists(modelSavePath):
            net.load_state_dict(torch.load(modelSavePath))

        #未过滤训练集实体的缺失比、过滤完训练集实体的缺失比
        disappear1, disappear2 = test(net, testIter, config)

        f.write('第%d次验证\n' % (i + 1))
        f.write('trainLoss: %f\n' % trainLoss)
        f.write('validLoss: %f\n' % validLoss)
        f.write('f1Score %f, accurate %f, recall %f\n' %
                (f1Score, accurate, recall))
        f.write('测试集中缺失比%f %f\n' % (disappear1, disappear2))
        f.write('\n')

    f.close()
Exemple #4
0
def main(config):
    trainDataPath = config['data']['trainDataPath']
    validDataPath = config['data']['validDataPath']
    testDataPath = config['data']['testDataPath']
    batchSize = config['model']['batchSize']

    #GPU/CPU
    DEVICE = config['DEVICE']

    trianDataset = NERDataset(trainDataPath, config)
    validDataset = NERDataset(validDataPath, config)
    testDataset = NERTestDataset(testDataPath, config)

    trainIter = data.DataLoader(dataset=trianDataset,
                                batch_size=batchSize,
                                shuffle=True,
                                num_workers=6,
                                collate_fn=pad)

    validIter = data.DataLoader(dataset=validDataset,
                                batch_size=batchSize,
                                shuffle=False,
                                num_workers=6,
                                collate_fn=pad)

    testIter = data.DataLoader(dataset=testDataset,
                               batch_size=batchSize,
                               shuffle=False,
                               num_workers=6,
                               collate_fn=testPad)

    if config['modelName'] == 'bilstm':
        net = BiLSTM(config)
        config['modelSavePath'] = config['data']['BiLSTMSavePath']
        modelSavePath = config['modelSavePath']
        config['submitDataPath'] = config['data']['BiLSTMSubmitDataPath']
        train = bilstm_train
        test = bilstm_test

    if config['modelName'] == 'bilstm_crf':
        net = BiLSTM_CRF(config)
        config['modelSavePath'] = config['data']['BiLSTMCRFSavePath']
        modelSavePath = config['modelSavePath']
        config['submitDataPath'] = config['data']['BiLSTMCRFSubmitDataPath']
        train = bilstm_crf_train
        test = bilstm_crf_test

    if config['modelName'] == 'transformer_cnn':
        net = Transformer_CNN(config)
        config['modelSavePath'] = config['data']['TransformerCNNSavePath']
        config['submitDataPath'] = config['data'][
            'TransformerCNNSubmitDataPath']
        modelSavePath = config['modelSavePath']
        train = transformer_cnn_train
        test = transformer_cnn_test

    if torch.cuda.device_count() > 1:
        net = nn.DataParallel(net)

    net = net.to(DEVICE)

    if os.path.exists(modelSavePath):
        net.load_state_dict(torch.load(modelSavePath))

    #if config['train']:
    #train(net, trainIter, validIter, config)

    #if config['test']:
    test(net, testIter, config)
result_list = list()
result_list_acc = list()
count = 0
try:
    for Ques_train, Ques_test in kf.split(Dataset):

        count += 1
        print("Fold ", count)
        if count == 2:
            #writeContentEmbeddings(model)
            break
        # define model
        model = BiLSTM(embedding_dim=EMBEDDING_DIM, hidden_dim=HIDDEN_DIM, vocab_size=len(text_field.vocab), label_size=len(label_field.vocab)-1,\
                              use_gpu=USE_GPU, batch_size=BATCH_SIZE)
        if USE_GPU:
            model = model.to(DEVICE)
        model.embeddings.weight.data.copy_(
            torch.from_numpy(pretrained_embeddings))
        optimizer = optim.Adam(model.parameters(), lr=1e-3)

        trainset = torch.utils.data.TensorDataset(
            torch.LongTensor(Dataset[Ques_train]),
            torch.torch.LongTensor(Dataset[Ques_train]))
        testset = torch.utils.data.TensorDataset(
            torch.LongTensor(Dataset[Ques_test]),
            torch.torch.LongTensor(Dataset[Ques_test]))

        train_loader = torch.utils.data.DataLoader(dataset=trainset,
                                                   batch_size=64)

        test_loader = torch.utils.data.DataLoader(dataset=testset,