|
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() |
|
|