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!")
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