Exemple #1
0
def predict(args):
    device = torch.device(args.device)
    cls_embed = torch.load(args.embedding_save_path)
    model = textCNN(args.embedding_size, args.cls_num, args.l1_channels_num)
    model.load_state_dict(torch.load(args.model_save_path))
    model.eval()
    model = model.to(device)
    cls_embed = cls_embed.to(device)
    cls_embed.eval()
    dev_dataset = DataSet(args.predict_data, None, args.batch_size)
    dev_dataset.reorderForEval()
    towrite = open(args.predict_writeto, "w+")
    towrite.write("idx,labels\n")
    idx = 0
    print("Begin Predict task...")
    while (True):
        (example, dump), p = dev_dataset.getPredictBatch(False)
        example = cls_embed(example, device=device)
        #    print(example.size())
        outs = model(example)
        outs = (torch.argmax(outs, -1) + 1).squeeze().tolist()
        for out in zip(example[1], outs):
            towrite.write("{0},{1}\n".format(out[0], int(out[1])))
            idx += 1
        if (p): break
    towrite.close()
    print("Predict task Done!")
Exemple #2
0
def train(args):
    device = torch.device(args.device)
    cls_embed = ModelEmbeddings.load_from_file(args.pretrain_vector)
    train_data = DataSet(args.train_data, args.train_labels, args.batch_size,
                         int(1e7))
    train_data.reorderForEval()
    #  train_data.padtoMaxLen()
    print('loading dev set...')
    #  devSet,devlabels,devNum=DataSet.load_devSet(args.dev_data,args.dev_labels)
    dev_dataset = DataSet(args.dev_data, args.dev_labels, args.batch_size,
                          int(1e7))
    dev_dataset.reorderForEval()
    print('Done dev loading.')
    model = textCNN(args.embedding_size, args.cls_num, args.l1_channels_num)
    model.train()
    model = model.to(device)
    cls_embed.train()
    cls_embed = cls_embed.to(device)
    optimizer = torch.optim.Adam([{
        'params': model.parameters()
    }, {
        'params': cls_embed.parameters(),
        'lr': 1.75 * args.lr
    }],
                                 lr=float(args.lr))
    Loss_fun = torch.nn.CrossEntropyLoss(reduction='sum')

    print('begin Maximum Likelihood training')
    epoch = 0
    sum_loss = 0
    step = 0
    tot_step = 0
    pi_2 = np.pi / 2
    while (True):
        optimizer.zero_grad()
        if (args.use_cos_batch and epoch):
            for param_group in optimizer.param_groups:
                param_group['lr'] = args.lr * np.cos(pi_2 * (step / tot_step))

        example, p = train_data.getTestBatch()
        t = example[0]
        l = example[1]
        example = None
        l = torch.tensor(l, device=device)
        #    print("Doing word embed")
        #    print(type(t))
        #    print(type(l))
        #    print(l.requires_grad)

        t = cls_embed(t, device=device)
        #    t=t.detach()
        #    print("Done word embed")
        #    print("feed into model...")

        outPuts = model(t)
        #    print("Get answer!")
        #    print("Caluating Loss")
        #    print(outPuts.size())
        #    print(l.size())
        #    print(l)
        #    print(outPuts)
        loss = Loss_fun(outPuts, l)
        loss.backward()
        optimizer.step()
        loss /= len(outPuts)
        sum_loss += loss
        print("epoch:{0},step:{1},train loss:{2}".format(epoch, step, loss))
        step += 1
        #    print("Doing backPro")
        #    print("Done backPro")
        #    print("Setping...")

        #    print("Done Step!")
        #    print('Current Batch Loss:{0}'.format(loss))
        if (p):
            tot_step = step
            epoch += p
            print("Epoch mean Loss:{0}".format(sum_loss / step))
            step = 0
            sum_loss = 0
            accuary, F1 = test(args, model, dev_dataset, cls_embed,
                               args.cls_num, device)
            if (model.lastScore < F1):
                print("F1 score grow from {0} to {1}, save model...".format(
                    model.lastScore, F1))
                model.lastScore = F1
                torch.save(model.state_dict(), args.model_save_path)
                torch.save(cls_embed, args.embedding_save_path)
                args.lr = args.lr * np.exp(args.lr_decay)
                for param_group in optimizer.param_groups:
                    param_group['lr'] = args.lr
            else:
                args.lr = args.lr / 2
                for param_group in optimizer.param_groups:
                    param_group['lr'] = args.lr
        if (epoch == args.max_epoch): break