Beispiel #1
0
def train(model, loss_Function, optimizer, train_data, dev_data, test_data, pretrainedWE, word2id, emotion, seed, testfile, predpath, best_char_dev_avgloss=1.0, EPOCH=100):
    #best_dev_acc = 0.0
    #print('->dev_data:', dev_data)
    best_dev_avgloss = best_char_dev_avgloss
    #no_up = 0
    no_drop = 0
    all_losses = []
    all_losses_dev = []
    for i in range(EPOCH):
        random.shuffle(train_data)
        print('epoch: %d start!' % i)
        #train_epoch(model, train_data, loss_Function, optimizer, word_to_ix, label_to_ix, i)
        all_losses, model = train_epoch(model, train_data, loss_Function, optimizer, pretrainedWE, word2id, i, all_losses)
        #print('now best dev acc:', best_dev_acc)
        print('now best dev loss:', best_dev_avgloss)
        #dev_acc = evaluate(model, dev_data, loss_Function, word_to_ix, label_to_ix, 'dev')
        #test_acc = evaluate(model, test_data, loss_Function, word_to_ix, label_to_ix, 'test')
        dev_avgloss, dev_pred_res, all_losses_dev = evaluate(model, dev_data, loss_Function, pretrainedWE, word2id, all_losses_dev, 'dev')
        #test_avgloss = evaluate(model, test_data, loss_Function, word_to_ix, 'test')
        #if dev_acc > best_dev_acc:
        if dev_avgloss < best_dev_avgloss:
            #best_dev_acc = dev_acc
            best_dev_avgloss = dev_avgloss
            os.system('rm best_models/best_model_avgloss_*.model')
            print('New Best Dev!!!', best_dev_avgloss)
            #torch.save(model.state_dict(), 'best_models/mr_best_model_acc_'+str(int(test_acc*10000)) + '.model')
            torch.save(model.state_dict(), 'best_models/best_model_avgloss_'+str(int(dev_avgloss*10000))+'.model')
            #no_up = 0.0
            no_drop = 0.0

            all_losses_test = []
            test_avgloss, test_pred_res, _ = evaluate(model, test_data, loss_Function, pretrainedWE, word2id, all_losses_test, 'test')

            predpathnow = predpath+emotion+str(seed)+'/'
            if not os.path.exists(predpathnow):
                os.makedirs(predpathnow)
            # predfile = 'predictions/en-'+emotion+str(SEED)+'.txt'
            predfile = predpathnow + 'epoch'+str(i)+'loss'+str(round(best_dev_avgloss, 4))+ '.txt'
            dataLoaderRegresser.outputPred(testfile, predfile, test_pred_res)

        else:
            #no_up += 1
            no_drop += 1
            #if no_up >= 10:
            if no_drop >= 20:
                #exit()
                break
    all_losses_test = []
    test_avgloss, test_pred_res, _ = evaluate(model, test_data, loss_Function, pretrainedWE, word2id, all_losses_test, 'test')
    return test_pred_res, all_losses, all_losses_dev
            #best_dev_acc = 0.0
            #model = LSTMClassifier(embedding_dim=EMBEDDING_DIM, hidden_dim=HIDDEN_DIM,
            #                       vocab_size=len(word_to_ix), label_size=len(label_to_ix))
            model = LSTMRegresser(embedding_dim=EMBEDDING_DIM,
                                  hidden_dim=HIDDEN_DIM,
                                  vocab_size=len(word_to_ix),
                                  n_output=1)
            model = model.to(device)
            #loss_Function = nn.NLLLoss()
            loss_Function = nn.MSELoss()
            loss_Function = loss_Function.to(device)
            optimizer = optim.Adam(model.parameters(), lr=0.0001)
            #optimizer = optim.SGD(model.parameters(), lr=0.01)

            #train(model, loss_Function, optimizer, train_data, dev_data, test_data, word_to_ix, label_to_ix, EPOCH=100)
            #test_pred_res = train(model, loss_Function, optimizer, train_data, dev_data, test_data, word_to_ix, EPOCH=2)
            test_pred_res = train(model,
                                  loss_Function,
                                  optimizer,
                                  train_data,
                                  dev_data,
                                  test_data,
                                  word_to_ix,
                                  EPOCH=EPOCH)

            predfile = 'predictions/en-' + emotion + str(SEED) + '.txt'
            dataLoaderRegresser.outputPred(testfile, predfile, test_pred_res)

            #for text, preddgr in zip(test_data, test_pred_res):
            #    print(text, '\t', preddgr.item())