def train_root(topic, group, test_on_annotated_data=False): args = argparse.ArgumentParser() args.add_argument('--m', dest='model', default='lstm', help='specify the mode to use (default: lstm)') args = args.parse_args() EPOCHS = 1 USE_GPU = torch.cuda.is_available() EMBEDDING_DIM = 300 HIDDEN_DIM = 150 BATCH_SIZE = 50 timestamp = str(int(time.time())) best_dev_acc = 0.0 text_field = data.Field(lower=True) label_field = data.Field(sequential=False) train_iter, dev_iter, test_iter = load_sst(text_field, label_field, BATCH_SIZE, topic, group, test_on_annotated_data=test_on_annotated_data) print (text_field.vocab.stoi["zzzzzzlove"]) model = LSTMSentiment(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.cuda() print('Load word embeddings...') # # glove # text_field.vocab.load_vectors('glove.6B.100d') # word2vector word_to_idx = text_field.vocab.stoi pretrained_embeddings = np.random.uniform(-0.25, 0.25, (len(text_field.vocab), 300)) pretrained_embeddings[0] = 0 word2vec = load_bin_vec('./data/GoogleNews-vectors-negative300-SLIM.bin', word_to_idx) for word, vector in word2vec.items(): pretrained_embeddings[word_to_idx[word]-1] = vector # text_field.vocab.load_vectors(wv_type='', wv_dim=300) model.embeddings.weight.data.copy_(torch.from_numpy(pretrained_embeddings)) # model.embeddings.weight.data = text_field.vocab.vectors # model.embeddings.embed.weight.requires_grad = False best_model = model optimizer = optim.Adam(model.parameters(), lr=1e-3) loss_function = nn.NLLLoss() print('Training...') #out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs", timestamp)) out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs")) print("Writing to {}\n".format(out_dir)) if not os.path.exists(out_dir): os.makedirs(out_dir) model_path = out_dir + '/best_model_'+topic+'_'+group + '.pth' for epoch in range(EPOCHS): avg_loss, acc = train_epoch_progress(model, train_iter, loss_function, optimizer, text_field, label_field, epoch) tqdm.write('Train: loss %.2f acc %.1f' % (avg_loss, acc*100)) #if epoch == 1: # ans = [] # test = doc_complete[:1000] # for x in test: # tl = [] # for w in x: # tl.append(text_field.vocab.stoi[w]) # t = evaluate2(model,torch.Tensor(tl).view(-1,1)) # ans.append(t[0][1]) # sort_idx = [i[0] for i in sorted(enumerate(ans), key= lambda x:x[1], reverse = True)] # tpo100 = sort_idx[:100] # pos_tweet = [test[t] for t in tpo100] # for idx,p in enumerate(pos_tweet): # p = " ".join(p) # print (str(idx)+" : "+ p) # print (" ") #evaluate1(model,torch.Tensor(tl).view(-1,1)) dev_acc = evaluate(model, dev_iter, loss_function, 'Dev') test_acc = evaluate(model, test_iter, loss_function, 'Test') if dev_acc > best_dev_acc: if best_dev_acc > 0: os.system('rm '+ model_path) best_dev_acc = dev_acc torch.save(model.state_dict(), model_path) print("Best model is saved.") model.load_state_dict(torch.load(model_path)) test_acc = evaluate(model, test_iter, loss_function, 'Final Test')
BATCH_SIZE) # if not args.model: # print('SALUT!') model = LSTMSentiment(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) print(model) model = torch.load('./data/modelLSTM.pt') # if args.model == 'bilstm': # model = BiLSTMSentiment(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.cuda() print('Load word embeddings...') # # glove # text_field.vocab.load_vectors('glove.6B.100d') # word2vector word_to_idx = text_field.vocab.stoi # print('type(text_field.vocab):', type(text_field.vocab)) # print('type(word_to_idx):', type(word_to_idx)) # print('word_to_idx.keys():', word_to_idx.keys()) keys = word_to_idx.keys() # print('type(keys):', type(keys)) # print('len(keys):', len(keys)) pretrained_embeddings = np.random.uniform(-0.25, 0.25,