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())