in eval_semisup.py [0:0]
def validate_network(val_loader, model):
    batch_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top5 = AverageMeter()
    global best_acc
    # switch to evaluate mode
    model.eval()
    criterion = nn.CrossEntropyLoss().cuda()
    with torch.no_grad():
        end = time.perf_counter()
        for i, (inp, target) in enumerate(val_loader):
            # move to gpu
            inp = inp.cuda(non_blocking=True)
            target = target.cuda(non_blocking=True)
            # compute output
            output = model(inp)
            loss = criterion(output, target)
            acc1, acc5 = accuracy(output, target, topk=(1, 5))
            losses.update(loss.item(), inp.size(0))
            top1.update(acc1[0], inp.size(0))
            top5.update(acc5[0], inp.size(0))
            # measure elapsed time
            batch_time.update(time.perf_counter() - end)
            end = time.perf_counter()
    if top1.avg.item() > best_acc[0]:
        best_acc = (top1.avg.item(), top5.avg.item())
    if args.rank == 0:
        logger.info(
            "Test:\t"
            "Time {batch_time.avg:.3f}\t"
            "Loss {loss.avg:.4f}\t"
            "Acc@1 {top1.avg:.3f}\t"
            "Best Acc@1 so far {acc:.1f}".format(
                batch_time=batch_time, loss=losses, top1=top1, acc=best_acc[0]))
    return losses.avg, top1.avg.item(), top5.avg.item()