def validate(self, epoch=-1): test_loss = 0 correct = 0 total = 0 progress_bar = ext.ProgressBar(len(self.val_loader)) self.model.eval() with torch.no_grad(): for inputs, targets in self.val_loader: inputs, targets = inputs.to(self.device), targets.to( self.device) outputs = self.model(inputs) test_loss += self.criterion(outputs, targets).item() * targets.size(0) prediction = outputs.max(1, keepdim=True)[1] correct += prediction.eq( targets.view_as(prediction)).sum().item() total += targets.size(0) progress_bar.step('Loss: {:.5g} | Accuracy: {:.2f}%'.format( test_loss / total, 100. * correct / total)) test_loss /= total accuracy = correct * 100. / total self.vis.add_value('test loss', test_loss) self.vis.add_value('test accuracy', accuracy) self.logger( 'Test on epoch {}: average loss={:.5g}, accuracy={:.2f}% ({}/{}), time: {}' .format(epoch, test_loss, accuracy, correct, total, progress_bar.time_used())) if not self.cfg.test and accuracy > self.best_acc: self.best_acc = accuracy self.saver.save_model('best.pth') self.logger('==> best accuracy: {:.2f}%'.format(self.best_acc)) return accuracy, test_loss
def train_epoch(self, epoch): self.logger( '\nEpoch: {}, lr: {:.2g}, weight decay: {:.2g} on model {}'.format( epoch, self.optimizer.param_groups[0]['lr'], self.optimizer.param_groups[0]['weight_decay'], self.model_name)) self.model.train() train_loss = 0 correct = 0 total = 0 progress_bar = ext.ProgressBar(len(self.train_loader)) for i, (inputs, targets) in enumerate(self.train_loader, 1): inputs = inputs.to(self.device) targets = inputs if self.cfg.arch == 'AE' else targets.to( self.device) #print(inputs.size()) # compute output outputs = self.model(inputs) losses = self.criterion(outputs, targets) # compute gradient and do SGD step self.optimizer.zero_grad() losses.backward() self.optimizer.step() # measure accuracy and record loss train_loss += losses.item() * targets.size(0) if self.cfg.arch == 'AE': correct = -train_loss else: pred = outputs.max(1, keepdim=True)[1] correct += pred.eq(targets.view_as(pred)).sum().item() total += targets.size(0) if i % 10 == 0 or i == len(self.train_loader): progress_bar.step( 'Loss: {:.5g} | Accuracy: {:.2f}%'.format( train_loss / total, 100. * correct / total), 10) train_loss /= total accuracy = 100. * correct / total self.vis.add_value('train loss', train_loss) self.vis.add_value('train accuracy', accuracy) self.logger( 'Train on epoch {}: average loss={:.5g}, accuracy={:.2f}% ({}/{}), time: {}' .format(epoch, train_loss, accuracy, correct, total, progress_bar.time_used())) return