Пример #1
0
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')
Пример #2
0
                                               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,