import torch from torch.autograd import Variable import time import sys from utils import * def val_epoch(epoch, data_loader, model, criterion, opt, logger): print('validation at epoch {}'.format(epoch)) model.eval() batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() top1 = AverageMeter() top5 = AverageMeter() end_time = time.time() for i, (inputs, targets) in enumerate(data_loader): data_time.update(time.time() - end_time) if not opt.no_cuda: targets = targets.cuda() with torch.no_grad(): inputs = Variable(inputs) targets = Variable(targets) outputs = model(inputs) loss = criterion(outputs, targets) prec1, prec5 = calculate_accuracy(outputs.data, targets.data, topk=(1, 5)) top1.update(prec1, inputs.size(0)) top5.update(prec5, inputs.size(0)) losses.update(loss.data, inputs.size(0)) batch_time.update(time.time() - end_time) end_time = time.time() if i % 10 == 0: print('Epoch: [{0}][{1}/{2}]\t' 'Time {batch_time.val:.5f} ({batch_time.avg:.5f})\t' 'Data {data_time.val:.5f} ({data_time.avg:.5f})\t' 'Loss {loss.val:.4f} ({loss.avg:.4f})\t' 'Prec@1 {top1.val:.5f} ({top1.avg:.5f})\t' 'Prec@5 {top5.val:.5f} ({top5.avg:.5f})'.format( epoch, i + 1, len(data_loader), batch_time=batch_time, data_time=data_time, loss=losses, top1=top1, top5=top5)) logger.log({'epoch': epoch, 'loss': losses.avg.item(), 'prec1': top1.avg.item(), 'prec5': top5.avg.item()}) return losses.avg.item(), top1.avg.item()