Example #1
0
 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
Example #2
0
    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