def train(): if not os.path.exists('train_model/'): os.makedirs('train_model/') if not os.path.exists('result/'): os.makedirs('result/') train_data, dev_data, word2id, id2word, char2id, opts = load_data( vars(args)) model = UNet(opts) if args.use_cuda: model = model.cuda() dev_batches = get_batches(dev_data, args.batch_size, evaluation=True) if args.eval: print('load model...') model.load_state_dict(torch.load(args.model_dir)) model.eval() model.Evaluate(dev_batches, args.data_path + 'dev_eval.json', answer_file='result/' + args.model_dir.split('/')[-1] + '.answers', drop_file=args.data_path + 'drop.json', dev=args.data_path + 'dev-v2.0.json') exit() if args.load_model: print('load model...') model.load_state_dict(torch.load(args.model_dir)) model.eval() _, F1 = model.Evaluate(dev_batches, args.data_path + 'dev_eval.json', answer_file='result/' + args.model_dir.split('/')[-1] + '.answers', drop_file=args.data_path + 'drop.json', dev=args.data_path + 'dev-v2.0.json') best_score = F1 with open(args.model_dir + '_f1_scores.pkl', 'rb') as f: f1_scores = pkl.load(f) with open(args.model_dir + '_em_scores.pkl', 'rb') as f: em_scores = pkl.load(f) else: best_score = 0.0 f1_scores = [] em_scores = [] parameters = filter(lambda p: p.requires_grad, model.parameters()) optimizer = torch.optim.Adamax(parameters, lr=args.lrate) lrate = args.lrate for epoch in range(1, args.epochs + 1): train_batches = get_batches(train_data, args.batch_size) dev_batches = get_batches(dev_data, args.batch_size, evaluation=True) total_size = len(train_data) // args.batch_size model.train() for i, train_batch in enumerate(train_batches): loss = model(train_batch) model.zero_grad() optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(parameters, opts['grad_clipping']) optimizer.step() model.reset_parameters() if i % 100 == 0: print( 'Epoch = %d, step = %d / %d, loss = %.5f, lrate = %.5f best_score = %.3f' % (epoch, i, total_size, model.train_loss.value, lrate, best_score)) sys.stdout.flush() model.eval() exact_match_score, F1 = model.Evaluate( dev_batches, args.data_path + 'dev_eval.json', answer_file='result/' + args.model_dir.split('/')[-1] + '.answers', drop_file=args.data_path + 'drop.json', dev=args.data_path + 'dev-v2.0.json') f1_scores.append(F1) em_scores.append(exact_match_score) with open(args.model_dir + '_f1_scores.pkl', 'wb') as f: pkl.dump(f1_scores, f) with open(args.model_dir + '_em_scores.pkl', 'wb') as f: pkl.dump(em_scores, f) if best_score < F1: best_score = F1 print('saving %s ...' % args.model_dir) torch.save(model.state_dict(), args.model_dir) if epoch > 0 and epoch % args.decay_period == 0: lrate *= args.decay for param_group in optimizer.param_groups: param_group['lr'] = lrate
scheduler = torch.optim.lr_scheduler.MultiStepLR( optimizer, milestones = [8,14,19,25,30,35], gamma = 0.1) print("Optimizer: ", optimizer.__class__.__name__) #开始训练 print("Start Training") for epoch in range(1,epochs+1): print("################## EPOCH {}/{} ##################".format(epoch, epochs)) scheduler.step() for t_index, (img, msk) in enumerate(train_loader): model.train() model.zero_grad() img,msk = img.to(device),msk.to(device) out = model(img) loss = criterion(out,msk) optimizer.zero_grad() loss.backward optimizer.step() sys.stdout.write("\r[Train] [Epoch {}/{}] [Batch {}/{}] [Loss:{}] [Learning Rate:{}]".format(epoch,epochs,t_index+1,len(train_loader),loss.item(),optimizer.param_groups[0]['lr'])) sys.stdout.flush()
def train(): if not os.path.exists("train_model/"): os.makedirs("train_model/") if not os.path.exists("result/"): os.makedirs("result/") train_data, dev_data, word2id, id2word, char2id, opts = load_data( vars(args)) model = UNet(opts) if args.use_cuda: model = model.cuda() dev_batches = get_batches(dev_data, args.batch_size, evaluation=True) if args.eval: print("load model...") model.load_state_dict(torch.load(args.model_dir)) model.eval() model.Evaluate( dev_batches, os.path.join(args.prepro_dir, "dev_eval.json"), answer_file="result/" + args.model_dir.split("/")[-1] + ".answers", drop_file=os.path.join(args.prepro_dir, "drop.json"), dev=args.dev_file, ) exit() if args.load_model: print("load model...") model.load_state_dict(torch.load(args.model_dir)) model.eval() _, F1 = model.Evaluate( dev_batches, os.path.join(args.prepro_dir, "dev_eval.json"), answer_file=os.path.join("result/", args.model_dir.split("/")[-1], ".answers"), drop_file=os.path.join(args.prepro_dir, "drop.json"), dev=args.dev_file, ) best_score = F1 with open(args.model_dir + "_f1_scores.pkl", "rb") as f: f1_scores = pkl.load(f) with open(args.model_dir + "_em_scores.pkl", "rb") as f: em_scores = pkl.load(f) else: best_score = 0.0 f1_scores = [] em_scores = [] parameters = filter(lambda p: p.requires_grad, model.parameters()) optimizer = torch.optim.Adamax(parameters, lr=args.lrate) lrate = args.lrate for epoch in range(1, args.epochs + 1): train_batches = get_batches(train_data, args.batch_size) dev_batches = get_batches(dev_data, args.batch_size, evaluation=True) total_size = len(train_data) // args.batch_size model.train() for i, train_batch in enumerate(train_batches): loss = model(train_batch) model.zero_grad() optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(parameters, opts["grad_clipping"]) optimizer.step() model.reset_parameters() if i % 100 == 0: print( "Epoch = %d, step = %d / %d, loss = %.5f, lrate = %.5f best_score = %.3f" % (epoch, i, total_size, model.train_loss.value, lrate, best_score)) sys.stdout.flush() model.eval() exact_match_score, F1 = model.Evaluate( dev_batches, os.path.join(args.prepro_dir, "dev_eval.json"), answer_file=os.path.join("result/", args.model_dir.split("/")[-1], ".answers"), drop_file=os.path.join(args.prepro_dir, "drop.json"), dev=args.dev_file, ) f1_scores.append(F1) em_scores.append(exact_match_score) with open(args.model_dir + "_f1_scores.pkl", "wb") as f: pkl.dump(f1_scores, f) with open(args.model_dir + "_em_scores.pkl", "wb") as f: pkl.dump(em_scores, f) if best_score < F1: best_score = F1 print("saving %s ..." % args.model_dir) torch.save(model.state_dict(), args.model_dir) if epoch > 0 and epoch % args.decay_period == 0: lrate *= args.decay for param_group in optimizer.param_groups: param_group["lr"] = lrate