Beispiel #1
0
def validate(val_loader, model, criterion, epoch, tracking=None):
    val_loader = tqdm.tqdm(val_loader)
    batch_time = utils.AverageMeter()
    losses = utils.AverageMeter()
    top1 = utils.AverageMeter()
    top5 = utils.AverageMeter()

    # switch to evaluate mode
    model.eval()

    end = time.time()
    for i, (input, target) in enumerate(val_loader):
        target = target.cuda(async=True)
        input_var = torch.autograd.Variable(input, volatile=True)
        target_var = torch.autograd.Variable(target, volatile=True)

        # compute output
        output = model(input_var)
        loss = criterion(output, target_var)

        # measure accuracy and record loss
        prec1, prec5 = accuracy(output.data, target, topk=(1, 5))
        losses.update(loss.data[0], input.size(0))
        top1.update(prec1[0], input.size(0))
        top5.update(prec5[0], input.size(0))

        # measure elapsed time
        batch_time.update(time.time() - end)
        if tracking is not None:
            result = OrderedDict()
            result['timestamp'] = datetime.now()
            result['batch_duration'] = batch_time.val
            result['epoch'] = epoch
            result['batch'] = i
            result['batch_size'] = input.size(0)
            result['top1_accuracy'] = prec1[0]
            result['top5_accuracy'] = prec5[0]
            result['loss'] = loss.data[0]
            utils.save_result(result, tracking)

        desc = ('Epoch {0} (Val):  '
                ' Loss {loss.val:.4f} ({loss.avg:.4f})'
                ' Prec@1 {top1.val:.3f} ({top1.avg:.3f})'
                ' Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(
                    epoch,
                    i,
                    len(val_loader),
                    batch_time=batch_time,
                    loss=losses,
                    top1=top1,
                    top5=top5))
        val_loader.set_description(desc)
        end = time.time()

    print("Evaluation: Prec@1 {top1.avg:.3f} Prec@5 {top5.avg:.3f}".format(
        top1=top1, top5=top5))
    return top1.avg, top5.avg
Beispiel #2
0
def infer_cifar10(dataset,
                  engine,
                  start=1,
                  end=128,
                  repeat=100,
                  log2=True,
                  output=None):
    if log2:
        start = int(np.floor(np.log2(start)))
        end = int(np.ceil(np.log2(end)))
        assert start >= 0
        assert end >= start
        batch_sizes = map(lambda x: 2**x, range(start, end + 1))
    else:
        batch_sizes = range(start, end + 1)
    results = []
    for batch_size in batch_sizes:
        times = time_batch_size(dataset,
                                batch_size,
                                engine.pred,
                                engine.use_cuda,
                                repeat=repeat)

        result = OrderedDict()
        result['nodename'] = os.uname().nodename
        result['model'] = engine.arch
        result['use_cuda'] = engine.use_cuda
        result['batch_size'] = batch_size
        result['mean'] = np.mean(times)
        result['std'] = np.std(times)
        result['throughput'] = batch_size / np.mean(times)
        result['path'] = engine.path
        if output is not None:
            save_result(result, output)

        print('batch_size: {batch_size:4d}'
              ' - mean: {mean:.4f}'
              ' - std: {std:.4f}'
              ' - throughput: {throughput:.4f}'.format(**result))
        results.append(result)

    return results
Beispiel #3
0
def run(epoch,
        model,
        loader,
        criterion=None,
        optimizer=None,
        top=(1, 5),
        use_cuda=False,
        tracking=None,
        train=True,
        half=False):
    accuracies = [utils.AverageMeter() for _ in top]

    assert criterion is not None or not train, 'Need criterion to train model'
    assert optimizer is not None or not train, 'Need optimizer to train model'
    loader = tqdm.tqdm(loader)
    if train:
        model.train()
        losses = utils.AverageMeter()
    else:
        model.eval()

    start = datetime.now()
    for batch_index, (inputs, targets) in enumerate(loader):
        inputs = Variable(inputs, requires_grad=False, volatile=not train)
        targets = Variable(targets, requires_grad=False, volatile=not train)
        batch_size = targets.size(0)
        assert batch_size < 2**32, 'Size is too large! correct will overflow'

        if use_cuda:
            inputs = inputs.cuda()
            targets = targets.cuda()
            if half:
                inputs = inputs.half()

        outputs = model(inputs)

        if train:
            loss = criterion(outputs, targets)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            losses.update(loss.data[0], batch_size)

        _, predictions = torch.max(outputs.data, 1)
        top_correct = correct(outputs, targets, top=top)
        for i, count in enumerate(top_correct):
            accuracies[i].update(count * (100. / batch_size), batch_size)

        end = datetime.now()
        if tracking is not None:
            result = OrderedDict()
            result['timestamp'] = datetime.now()
            result['batch_duration'] = end - start
            result['epoch'] = epoch
            result['batch'] = batch_index
            result['batch_size'] = batch_size
            for i, k in enumerate(top):
                result['top{}_correct'.format(k)] = top_correct[i]
                result['top{}_accuracy'.format(k)] = accuracies[i].val
            if train:
                result['loss'] = loss.data[0]
            utils.save_result(result, tracking)

        desc = 'Epoch {} {}'.format(epoch, '(Train):' if train else '(Val):  ')
        if train:
            desc += ' Loss {loss.val:.4f} ({loss.avg:.4f})'.format(loss=losses)
        for k, acc in zip(top, accuracies):
            desc += ' Prec@{} {acc.val:.3f} ({acc.avg:.3f})'.format(k, acc=acc)
        loader.set_description(desc)
        start = datetime.now()

    if train:
        message = 'Training accuracy of'
    else:
        message = 'Validation accuracy of'
    for i, k in enumerate(top):
        message += ' top-{}: {}'.format(k, accuracies[i].avg)
    print(message)
    return accuracies[0].avg
Beispiel #4
0
def train_one_epoch(train_loader,
                    model,
                    criterion,
                    optimizer,
                    epoch,
                    tracking=None):
    train_loader = tqdm.tqdm(train_loader)
    batch_time = utils.AverageMeter()
    data_time = utils.AverageMeter()
    losses = utils.AverageMeter()
    top1 = utils.AverageMeter()
    top5 = utils.AverageMeter()

    # switch to train mode
    model.train()

    end = time.time()
    for i, (input, target) in enumerate(train_loader):
        # measure data loading time
        data_time.update(time.time() - end)

        target = target.cuda(async=True)
        input_var = torch.autograd.Variable(input)
        target_var = torch.autograd.Variable(target)

        # compute output
        output = model(input_var)
        loss = criterion(output, target_var)

        # measure accuracy and record loss
        prec1, prec5 = accuracy(output.data, target, topk=(1, 5))
        losses.update(loss.data[0], input.size(0))
        top1.update(prec1[0], input.size(0))
        top5.update(prec5[0], input.size(0))

        # compute gradient and do SGD step
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # measure elapsed time
        batch_time.update(time.time() - end)
        if tracking is not None:
            result = OrderedDict()
            result['timestamp'] = datetime.now()
            result['batch_duration'] = batch_time.val
            result['epoch'] = epoch
            result['batch'] = i
            result['batch_size'] = input.size(0)
            result['top1_accuracy'] = prec1[0]
            result['top5_accuracy'] = prec5[0]
            result['loss'] = loss.data[0]
            result['data_duration'] = data_time.val
            utils.save_result(result, tracking)

        desc = ('Epoch {0} (Train):'
                ' Loss {loss.val:.4f} ({loss.avg:.4f})'
                ' Prec@1 {top1.val:.3f} ({top1.avg:.3f})'
                ' Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(
                    epoch,
                    i,
                    len(train_loader),
                    batch_time=batch_time,
                    data_time=data_time,
                    loss=losses,
                    top1=top1,
                    top5=top5))
        train_loader.set_description(desc)

        end = time.time()

    return top1.avg, top5.avg