def run(self, epoch=None): ''' Run a training loop. ''' if epoch is None: epoch = self.args.n_epoch print('mbsize: {}, hidden size: {}, layer: {}, dropout: {}'.format( self.mb, self.hidden, self.layer, self.dropout), file=self.file) # Init the model, the optimizer and some structures for logging self.reset() model = MLP(self.hidden, self.layer, self.dropout) #print(model) model.reset_parameters() #model.cuda() model.to(self.args.device) #model = torch.nn.DataParallel(model) opt = optim.Adam(model.parameters()) acc = 0 # best dev. acc. accc = 0 # test acc. at the time of best dev. acc. e = -1 # best dev iteration/epoch times = [] losses = [] ftime = [] btime = [] utime = [] print('Initial evaluation on dev set:') self._evaluate(model, self.devloader, 'dev') start = time.time() # training loop for t in range(epoch): print('{}:'.format(t), end='', file=self.file, flush=True) # train #start = torch.cuda.Event(True) #end = torch.cuda.Event(True) #start.record() loss, ft, bt, ut = self._train(model, opt) #end.record() #end.synchronize() #ttime = start.elapsed_time(end) print("(wall time: {:.1f} sec) ".format(time.time() - start), end='') #times.append(ttime) losses.append(loss) ftime.append(ft) btime.append(bt) utime.append(ut) # predict curacc = self._evaluate(model, self.devloader, 'dev') #if curacc > acc: # e = t # acc = curacc # accc = self._evaluate(model, self.testloader, ' test') etime = [sum(t) for t in zip(ftime, btime, utime)] print('test acc: {:.2f}'.format( self._evaluate(model, self.testloader, ' test'))) print('best on val set - ${:.2f}|{:.2f} at {}'.format(acc, accc, e), file=self.file, flush=True) print('', file=self.file)
y_pred, y_true = [], [] for step,(x,y) in enumerate(loader): x = x.cuda(device) out = model(x) y_pred.append(torch.argmax(out, dim=1, keepdim=True).cpu()) y_true.append(y) return evaluator.eval({ "y_true": torch.cat(y_true, dim=0), "y_pred": torch.cat(y_pred, dim=0), })['acc'] bad_counter = 0 best = 0 best_epoch = 0 train_time = 0 model.reset_parameters() print("--------------------------") print("Training...") for epoch in range(args.epochs): loss_tra,train_ep = train(model,args.dev,train_loader,optimizer) f1_val = validate(model, args.dev, valid_loader, evaluator) train_time+=train_ep if(epoch+1)%5 == 0: print(f'Epoch:{epoch+1:02d},' f'Train_loss:{loss_tra:.3f}', f'Valid_acc:{100*f1_val:.3f}%', f'Time_cost{train_time:.3f}') if f1_val > best: best = f1_val best_epoch = epoch torch.save(model.state_dict(), checkpt_file)