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()
    accuracies = 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(async=True)
        inputs = Variable(inputs, volatile=True)
        targets = Variable(targets, volatile=True)
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        acc = calculate_accuracy(outputs, targets)

        losses.update(loss.data[0], inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                  epoch,
                  i + 1,
                  len(data_loader),
                  batch_time=batch_time,
                  data_time=data_time,
                  loss=losses,
                  acc=accuracies))

    logger.log({'epoch': epoch, 'loss': losses.avg, 'acc': accuracies.avg})

    return losses.avg
Exemple #2
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, opt,
                epoch_logger, batch_logger):
    print('train at epoch {}'.format(epoch))

    model.train()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()
    print("len: ", len(data_loader))
    for i, (inputs, targets) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        if not opt.no_cuda:
            targets = targets.cuda(async=True)
        inputs = Variable(inputs)
        targets = Variable(targets)
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        acc = calculate_accuracy(outputs, targets)

        losses.update(loss.data[0], inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i + 1),
            'loss': losses.val,
            'acc': accuracies.val,
            'lr': optimizer.param_groups[0]['lr']
        })

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(opt.result_path,
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)
Exemple #3
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, opt,
                epoch_logger, batch_logger):
    print('train at epoch {}'.format(epoch))

    model.train()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()

    write_embedding = True
    writer = None
    embedding_log = 20

    for i, (inputs, targets) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        if not opt.no_cuda:
            targets = targets.cuda(async=True)
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        acc = calculate_accuracy(outputs, targets)

        losses.update(loss.item(), inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i + 1),
            'loss': losses.val,
            'acc': accuracies.val,
            'lr': optimizer.param_groups[0]['lr']
        })

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

        if write_embedding and epoch % embedding_log == 0:
            if writer is None:
                writer = SummaryWriter(comment='_embedding_train_' + str(i))
            n_iter = (epoch * len(data_loader)) + i
            middle_frame = math.floor(inputs.data.shape[2] / 2)
            writer.add_embedding(outputs.data,
                                 metadata=targets.data,
                                 label_img=torch.squeeze(
                                     inputs.data[:, :, middle_frame, :, :], 2),
                                 global_step=n_iter)

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(opt.result_path,
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)

    return epoch, losses.avg, accuracies.avg
Exemple #4
0
def train_epoch(epoch, data_loader, model, model_clone, feature_v_dict,
                feature_a_dict, nowidx, criterion, optimizer, opt,
                epoch_logger, batch_logger):
    print('train at epoch {}'.format(epoch))

    model.train()
    model_clone.train()

    cuda = torch.device("cuda")

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()
    for i, (video, audio) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        video = video.to(device=cuda)
        audio = audio.to(device=cuda)
        bs = video.size(0)
        device = video.device

        feature_v, feature_a = model(video, audio)

        target = torch.arange(bs).to(device=device)
        feature_a_all = torch.cat([feature_a.detach(), feature_a_dict], dim=0)
        feature_v_all = torch.cat([feature_v.detach(), feature_v_dict], dim=0)

        cosv2a = torch.mm(feature_a_all, feature_v.t()).t()
        cosa2v = torch.mm(feature_v_all, feature_a.t()).t()

        loss1 = criterion(cosv2a, target)
        loss2 = criterion(cosa2v, target)
        loss = loss1 + loss2

        tmp = cosv2a.argmax(dim=1)
        print(tmp)

        acc = calculate_accuracy(cosv2a, target)

        losses.update(loss.data.item(), video.size(0))
        accuracies.update(acc, video.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        momentum_update(model, model_clone, 0.9)

        with torch.no_grad():
            feature_v, feature_a = model_clone(video, audio)
            feature_v_dict[nowidx:nowidx + bs] = feature_v.detach()
            feature_a_dict[nowidx:nowidx + bs] = feature_a.detach()
            nowidx += bs
            if nowidx + bs > feature_v_dict.shape[0]:
                nowidx = 0

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i + 1),
            'loss': losses.val,
            'acc': accuracies.val,
            'lr': optimizer.param_groups[0]['lr']
        })

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(opt.result_path,
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)

    return feature_v_dict, feature_a_dict, nowidx
Exemple #5
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, args, device,
                epoch_logger, batch_logger):
    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top3 = AverageMeter()

    # switch to train mode
    model.train()

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

        input = input.to(device)
        target = target.to(device)

        # compute output and loss
        output = model(input)
        loss = criterion(output, target)

        # measure accuracy and record loss
        prec1, prec3 = calculate_accuracy(output, target, topk=(1, 3))
        losses.update(loss.item(), input.size(0))
        # prec1[0]: convert torch.Size([1]) to torch.Size([])
        top1.update(prec1[0].item(), input.size(0))
        top3.update(prec3[0].item(), input.size(0))
        """
        a = np.array([1, 2, 3])
        b = torch.from_numpy(a)  # tensor([ 1,  2,  3])
        c = b.sum()  # tensor(6)
        d = b.sum(0)  # tensor(6)
        e = b.sum(0, keepdim=True)  # tensor([ 6]), torch.Size([1])
        e[0]  # tensor(6), torch.Size([])
        e.item()  # 6
        """

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

        # measure elapsed time
        batch_time.update(time.time() - end_time)
        end_time = time.time()

        if (i + 1) % args.log_interval == 0:
            print('Train Epoch [{0}/{1}]([{2}/{3}])\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t'
                  'Prec@3 {top3.val:.3f} ({top3.avg:.3f})\t'
                  'LR {lr:f}\t'
                  'Batch Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data Time {data_time.val:.3f} ({data_time.avg:.3f})'.format(
                      epoch,
                      args.epochs,
                      i + 1,
                      len(data_loader),
                      loss=losses,
                      top1=top1,
                      top3=top3,
                      lr=optimizer.param_groups[0]['lr'],
                      batch_time=batch_time,
                      data_time=data_time))

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i + 1),
            'loss': losses.val,
            'top1': top1.val,
            'top3': top3.val,
            'lr': optimizer.param_groups[0]['lr']
        })

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'top1': top1.avg,
        'top3': top3.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % args.checkpoint_interval == 0:
        save_file_path = os.path.join(
            args.checkpoint_path, 'save_{}_{}.pth'.format(args.arch, epoch))
        states = {
            'epoch': epoch,
            'arch': args.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)

    vis.plot('Train loss', losses.avg)
    vis.plot('Train accu', top1.avg)
    vis.log("epoch:{epoch}, lr:{lr}, loss:{loss}, accu:{accu}".format(
        epoch=epoch,
        lr=optimizer.param_groups[0]['lr'],
        loss=losses.avg,
        accu=top1.avg))
    def run_iter(inputs, labels, iteration, train=True, log_fn=None):
        prefix = 'train' if train else 'val'
        loss_eq = args.loss if train else args.val_loss
        if log_fn is None:

            def log_fn(tag, value):
                if isinstance(value, float) or len(value.size()) == 0:
                    writer.add_scalar(f'{prefix}/{tag}', value, iteration)
                elif len(value.size()) == 3 and iteration % 100 == 0:
                    writer.add_image(f'{prefix}/{tag}', value, iteration)
                elif len(value.size()) == 4 and iteration % 100 == 0:
                    writer.add_images(f'{prefix}/{tag}', value, iteration)

        model.eval()  # set model to eval to generate adversarial examples

        if torch.cuda.is_available():
            inputs = inputs.cuda()
            labels = labels.cuda()

        non_batch_dims = inputs.size()[1:]

        inputs_to_compute: List[torch.Tensor] = []
        computed_logits: List[torch.Tensor] = []
        computed_grads: List[torch.Tensor] = []

        loss_objects: Dict[str, losses.Loss] = {}
        for loss_name, Loss in LOSS_FUNCTIONS.items():
            loss_objects[loss_name] = Loss(
                model,
                normalizer,
                inputs,
                labels,
                args.dataset,
                log_fn,
                train,
                inputs_to_compute,
                computed_logits,
            )

        # DETERMINE INPUTS TO RUN MODEL OVER
        inputs_to_compute.append(inputs)

        first_eval_locals: DefaultDict[str, Any] = \
            defaultdict(lambda: math.nan)
        first_eval_locals.update(loss_objects)
        first_eval_locals.update(globals())
        first_eval_locals.update(builtins.__dict__)
        eval(loss_eq, None, first_eval_locals)

        # FORWARD PASS
        if train:
            optimizer.zero_grad()
            model.train()  # now we set the model to train mode

        for inputs in inputs_to_compute:
            inputs.requires_grad = True
        all_inputs = torch.cat(inputs_to_compute)

        all_logits = model(normalizer(all_inputs))

        # CALCULATE GRADIENT
        base_loss = utils.calculate_base_loss(
            all_logits,
            torch.cat([labels] * len(inputs_to_compute)),
        )
        all_grads, = torch.autograd.grad(base_loss.sum(),
                                         all_inputs,
                                         create_graph=True,
                                         retain_graph=True)
        for i in range(len(inputs_to_compute)):
            sl = slice(i * len(inputs), (i + 1) * len(inputs))
            computed_logits.append(all_logits[sl])
            computed_grads.append(all_grads[sl])

        # CONSTRUCT LOSS
        logits = computed_logits[0]
        grads = computed_grads[0]

        base_loss = utils.calculate_base_loss(logits, labels)
        grads_magnitude = (grads ** 2) \
            .sum(dim=list(range(1, len(grads.size())))) \
            .sqrt()

        l_base = torch.mean(base_loss)
        l_ce = nn.CrossEntropyLoss()(logits, labels)
        if 'diff' in args.base_loss:
            l_diff = l_base
        l_grad = torch.mean(grads_magnitude)
        l_grad_l1 = grads.abs().sum(
            dim=list(range(1, len(grads.size())))).mean()

        for loss_object in loss_objects.values():
            loss_object.switch_to_eval()
        second_eval_locals = dict(locals())
        second_eval_locals.update(loss_objects)
        second_eval_locals.update(builtins.__dict__)
        loss = eval(loss_eq, None, second_eval_locals)

        # LOGGING
        accuracy = utils.calculate_accuracy(logits, labels)
        log_fn('loss/loss', loss.item())
        log_fn('loss/ce', l_ce.item())
        log_fn('loss/base', l_base.item())
        if 'diff' in args.base_loss:
            log_fn('loss/diff', l_diff.item())
        log_fn('loss/grad', l_grad.item())
        log_fn('loss/grad_l1', l_grad_l1.item())
        log_fn('accuracy', accuracy.item())
        if train:
            print(f'ITER {iteration:06d}',
                  f'accuracy: {accuracy.item() * 100:5.1f}%',
                  f'loss: {loss.item():.2f}',
                  sep='\t')

        if train and iteration % 1000 == 0:
            for name, param in model.named_parameters():
                writer.add_histogram(f'train/model/{name}',
                                     param.clone().cpu().data.numpy(),
                                     iteration)

        # OPTIMIZATION
        if train:
            loss.backward()

            # log gradient norm
            param_grads = torch.cat(
                [param.grad.data.view(-1) for param in model.parameters()])
            log_fn('param_grad_l2', param_grads.norm(p=2).item())
            log_fn('param_grad_linf', param_grads.norm(p=math.inf).item())

            # clip gradients and optimize
            nn.utils.clip_grad_value_(model.parameters(), args.clip_grad)
            optimizer.step()
Exemple #7
0
def test_epoch(epoch, model, data_loader, criterion, logger, num_classes=200, cas_num=3):
    model.eval()
    epoch_losses_cas = np.zeros([cas_num, 3])
    epoch_acc_cas = np.zeros([cas_num])
    epoch_off_cas = np.zeros([cas_num])

    for n_iter, (feat, start_unit, end_unit, gt_start_unit, gt_end_unit, label) in enumerate(data_loader):
        mini_batch_size = len(feat)
        # In BMVC paper, we used prob multiplication to calculate final prob,
        # but later experiments showed that weighted average gives more stable results.
        # final_action_prob = torch.ones([mini_batch_size, num_classes])
        final_action_prob = torch.zeros([mini_batch_size, num_classes])
        for k in range(cas_num):
            # compute input and target
            inputs = []
            targets = []
            for b in range(mini_batch_size):
                inputs.append(data_loader.dataset.generate_input(feat[b], start_unit[b], end_unit[b]))
                targets.append(data_loader.dataset.generate_target(label[b], start_unit[b], end_unit[b],
                                                                  gt_start_unit[b], gt_end_unit[b]))
            inputs = torch.stack(inputs, 0)
            targets = torch.stack(targets, 0)
            targets = targets.cuda()

            # run model for current cascade
            outputs = model(inputs)
            losses = criterion(outputs, targets)
            epoch_losses_cas[k, 0] += losses['loss'].cpu().detach().numpy()
            epoch_losses_cas[k, 1] += losses['cls_loss'].cpu().detach().numpy()
            epoch_losses_cas[k, 2] += losses['reg_loss'].cpu().detach().numpy()

            epoch_acc_cas[k] += calculate_accuracy(outputs, targets)
            epoch_off_cas[k] += calculate_offset(outputs, targets)

            # update the boundaries of current proposals
            outputs = outputs.cpu().detach()
            action_score = outputs[:, 1:1+num_classes]
            action_prob = torch.softmax(action_score, 1)
            # In BMVC paper, we used prob multiplication to calculate final prob,
            # but later experiments showed that weighted average gives more stable results.
            # final_action_prob *= action_prob
            final_action_prob = final_action_prob + prob_weights[k] * action_prob

            if k == cas_num - 1:
                break

            pred_action = torch.argmax(final_action_prob, 1) + 1  # (b,), 1 ~ 200
            start_unit = [start_unit[i] + outputs[i, 1+num_classes+pred_action[i]].item() for i in range(mini_batch_size)]
            end_unit = [end_unit[i] + outputs[i, 2*(1+num_classes)+pred_action[i]].item() for i in range(mini_batch_size)]
            for i in range(mini_batch_size):
                if start_unit[i] > end_unit[i]:
                    new_su = (start_unit[i]+end_unit[i]) / 2.0 - 0.2
                    new_eu = (start_unit[i]+end_unit[i]) / 2.0 + 0.2
                    start_unit[i] = new_su
                    end_unit[i] = new_eu

    epoch_losses_cas /= (n_iter + 1)
    epoch_acc_cas /= (n_iter + 1)
    epoch_off_cas /= (n_iter + 1)

    for k in range(cas_num):
        logger.log({
            'epoch': epoch,
            'cas': k,
            'loss': epoch_losses_cas[k, 0],
            'cls_loss': epoch_losses_cas[k, 1],
            'reg_loss': epoch_losses_cas[k, 2],
            'acc': epoch_acc_cas[k],
            'off': epoch_off_cas[k]
        })

    print('Epoch {} validation (cascade 0) loss: {} cls_loss: {}, reg_loss: {} acc: {} off: {}'.format(
     epoch, epoch_losses_cas[0, 0], epoch_losses_cas[0, 1], epoch_losses_cas[0, 2], epoch_acc_cas[0], epoch_off_cas[0]))
    for k in range(1, cas_num):
        print('                    (cascade {}) loss: {} cls_loss: {}, reg_loss: {} acc: {} off: {}'.format(
         k, epoch_losses_cas[k, 0], epoch_losses_cas[k, 1], epoch_losses_cas[k, 2], epoch_acc_cas[k], epoch_off_cas[k]))

    return epoch_losses_cas[cas_num-1, 0], epoch_acc_cas[cas_num-1]
Exemple #8
0
def train_epoch(epoch, data_loader, model, teacher_model, optimizer, opt,
                epoch_logger, batch_logger):
    print('train at epoch {}'.format(epoch))
    model.train()
    teacher_model.eval()
    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()
    # Get teacher model outputs
    # if not _teacher_outputs_dict:
    #    print("Executing teacher model...")
    #    for i, (inputs, targets, indices) in enumerate(data_loader):
    #        if not opt.no_cuda:
    #            inputs, targets = inputs.cuda(async=True), targets.cuda(async=True)

    #        inputs = Variable(inputs)
    #        targets = Variable(targets)
    #        teacher_output = teacher_model(inputs).data.cpu().numpy()
    # print("Teacher output shape", teacher_output.shape)
    # teacher_outputs.append(teacher_output)
    #        for i in range(len(indices)):
    #            _teacher_outputs_dict[indices[i].item()] = teacher_output[i]
    #else:
    #    print("Skipping teacher model execution...")

    # Check if it is teacher output
    # print("teacher output", _teacher_outputs_dict.keys())

    end_time = time.time()
    for i, (inputs, targets, indices) in enumerate(data_loader):
        data_time.update(time.time() - end_time)
        if not opt.no_cuda:
            inputs = inputs.cuda(async=True)
            targets = targets.cuda(async=True)
        inputs = Variable(inputs)
        targets = Variable(targets)
        outputs = model(inputs)
        # loss = criterion(outputs, targets)
        # teacher_outputs = []
        # for idx in indices:
        # print("idx, teacher output", idx, _teacher_outputs_dict[idx.item()])
        #    teacher_outputs.append(_teacher_outputs_dict[idx.item()])
        #teacher_outputs = np.asarray(teacher_outputs)

        # teacher_output = torch.from_numpy(teacher_outputs)
        #if not opt.no_cuda:
        #    teacher_output = teacher_output.cuda(async=True)
        #    teacher_output = Variable(teacher_output, requires_grad=False)

        # get teacher output.
        teacher_output = teacher_model(inputs)
        loss = loss_kd(outputs, teacher_output, targets)
        acc = calculate_accuracy(outputs, targets)

        # losses.update(loss.data[0], inputs.size(0))
        losses.update(loss.data.item(), inputs.size(0))

        accuracies.update(acc, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i + 1),
            'loss': losses.val,
            'acc': accuracies.val,
            'lr': optimizer.param_groups[0]['lr']
        })

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(opt.result_path,
                                      'save_{}.pth'.format(epoch))
        if not opt.no_cuda:
            state_dict = model.module.state_dict()
        else:
            state_dict = model.state_dict()

        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': state_dict,
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)
def val_epoch(epoch,
              data_loader,
              model,
              criterion,
              output_directory,
              logger=None,
              write_to_file=True):
    print('validation at epoch {}'.format(epoch))

    fieldnames = ['video', 'label']

    if write_to_file:
        filename = 'test-' + str(epoch) + '.csv'
        test_csv = os.path.join(output_directory, filename)
        with open(test_csv, 'w') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()

    model.eval()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()
    for i, (inputs, targets, paths) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        # if not opt.no_cuda:
        #     targets = targets.cuda(async=True)
        # inputs = Variable(inputs, volatile=True)
        # targets = Variable(targets, volatile=True)

        if torch.cuda.is_available():
            inputs = inputs.cuda()
            targets = targets.cuda()

        torch.cuda.synchronize()

        outputs = model(inputs)
        loss = criterion(outputs, targets)

        torch.cuda.synchronize()

        acc = calculate_accuracy(outputs, targets)

        losses.update(loss.data[0], inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        print('Test: Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

        _, pred = outputs.topk(1, 1, True)
        pred = pred.t()
        print('pred: ', pred.item())

        if write_to_file:
            with open(test_csv, 'a') as csvfile:
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                writer.writerow({'video': paths[0], 'label': pred.item() + 1})

    # logger.log({'epoch': epoch, 'loss': losses.avg, 'acc': accuracies.avg})
    if logger is not None:
        logger.add_scalar('Test/loss', losses.avg, epoch)
        logger.add_scalar('Test/Acc', accuracies.avg, epoch)
    return losses.avg
Exemple #10
0
def classify_video_offline(class_names, model, opt, video_path_formatter=lambda root_path, label, video_id: Path(
    join(root_path, label, video_id))):
    device = torch.device('cpu' if opt.no_cuda else 'cuda')

    data_loader = create_dataset_offline(opt, video_path_formatter)

    accuracies = AverageMeter()

    class_size = len(class_names)
    class_idx = list(range(0, class_size))

    ground_truth_labels = []
    predicted_labels = []
    executions_times = []

    all_video_results = []
    all_execution_times = []

    print('Starting prediction phase')

    with torch.no_grad():
        for (inputs, targets, segments, video_name) in data_loader:
            targets = targets.to(device, non_blocking=True)

            # One video at a time
            video_name = video_name[0]
            segments = segments[0]
            print(f'Giving input {video_name} to the NN...')

            start_time = time.time()
            outputs = model(inputs)
            end_time = time.time()

            execution_time = (end_time - start_time)
            # print(len(inputs))
            # print(len(targets))
            # print(f'Execution time: {execution_time}')

            executions_times.append(execution_time)
            acc = calculate_accuracy(outputs, targets)

            ground_truth, predictions = ground_truth_and_predictions(outputs, targets)
            predictions = flatten(predictions)

            # print(ground_truth)
            # print(predictions)
            ground_truth_labels.extend(ground_truth)
            predicted_labels.extend(predictions)

            accuracies.update(acc, inputs.size(0))

            video_outputs = outputs.cpu().data

            exec_times_with_segments = []

            for i in range(len(segments)):
                segment = segments[i]
                # TODO this is not totally correct, but i have no choice here
                # This is because now, the input frame batches are processed only once and together, so i do not have the
                # execution time for a single batch. So, this outputs the time the NN takes to process all the batches of
                # a single video
                # To fix this, you should adapt the code in the 'live' settings here, because there the prediction time
                # is per batch. See `classify_video_online` or just slice the input tensor
                exec_time = execution_time

                exec_times_with_segments.append((segment, exec_time))

            executions_times_with_video_name = {
                video_name: exec_times_with_segments
            }

            single_video_result = {
                'video': video_name,
                'clips': []
            }

            for i in range(len(predictions)):
                clip_results = {
                    'segment': segments[i]
                }

                if opt.mode == 'score':
                    clip_results['label'] = class_names[predictions[i]]
                    clip_results['scores'] = video_outputs[i].tolist()
                elif opt.mode == 'feature':
                    clip_results['features'] = video_outputs[i].tolist()

                single_video_result['clips'].append(clip_results)

            all_video_results.append(single_video_result)
            all_execution_times.append(executions_times_with_video_name)

        accuracies_avg = accuracies.avg

        precision, recall, fscore, _ = \
            precision_recall_fscore_support(ground_truth_labels,
                                            predicted_labels,
                                            labels=class_idx)

        mean_exec_times = np.mean(executions_times)
        std_exec_times = np.std(executions_times)

        # print(f'Acc:{accuracies_avg}')
        # print(f'prec: {precision}')
        # print(f'rec: {recall}')
        # print(f'f-score: {fscore}')
        # print(mean_exec_times)
        # print(std_exec_times)

        with open(opt.output_csv, 'w+') as csv_file:
            writer = csv.writer(csv_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
            header = ["VIDEO_NAME", "MEAN_PREDICTION_TIME", "STANDARD_DEV_PREDICTION_TIME", "ACCURACY"]

            create_column_metric_csv_header("PRECISION", class_names, header)
            create_column_metric_csv_header("RECALL", class_names, header)
            create_column_metric_csv_header("F-SCORE", class_names, header)

            writer.writerow(header)

            final_row = ['Metrics_overall_dataset', mean_exec_times, std_exec_times, accuracies_avg]

            create_column_metric_csv_content(precision, final_row)
            create_column_metric_csv_content(recall, final_row)
            create_column_metric_csv_content(fscore, final_row)

            writer.writerow(final_row)

        return all_video_results, all_execution_times
def fine_tune(load_dir,
              save_dir,
              filename,
              dataloader_train,
              dataloader_val,
              ContinuousTrain=False):
    '''
    load pretrained model
    resnet-18-kinetics.pth: --model resnet --model_depth 18 --resnet_shortcut A
    resnet-34-kinetics.pth: --model resnet --model_depth 34 --resnet_shortcut A
    resnet-34-kinetics-cpu.pth: CPU ver. of resnet-34-kinetics.pth
    resnet-50-kinetics.pth: --model resnet --model_depth 50 --resnet_shortcut B
    resnet-101-kinetics.pth: --model resnet --model_depth 101 --resnet_shortcut B
    resnet-152-kinetics.pth: --model resnet --model_depth 152 --resnet_shortcut B
    resnet-200-kinetics.pth: --model resnet --model_depth 200 --resnet_shortcut B
    preresnet-200-kinetics.pth: --model preresnet --model_depth 200 --resnet_shortcut B
    wideresnet-50-kinetics.pth: --model wideresnet --model_depth 50 --resnet_shortcut B --wide_resnet_k 2
    resnext-101-kinetics.pth: --model resnext --model_depth 101 --resnet_shortcut B --resnext_cardinality 32
    densenet-121-kinetics.pth: --model densenet --model_depth 121
    densenet-201-kinetics.pth: --model densenet --model_depth 201
    '''
    num_epochs = 100
    step = 0
    if not ContinuousTrain:
        model = resnet.resnet152(sample_size=112,
                                 sample_duration=args.n_frames_per_clip,
                                 shortcut_type='B',
                                 num_classes=83)
        checkpoint = utils.load_checkpoint(load_dir, filename)
        model = nn.DataParallel(model, device_ids=[1])
        state_dict = deepcopy(model.state_dict())
        feature_state_dict = {
            key: value
            for key, value in checkpoint['state_dict'].items()
            if key not in ['module.fc.weight', 'module.fc.bias']
        }
        state_dict.update(feature_state_dict)
        model.load_state_dict(state_dict)

        # set fine tune parameters: Conv5_x and fc layer from original paper
        for param in model.module.parameters():
            param.requires_grad = False
        for named_child in model.module.named_children():
            if named_child[0] == 'fc' or named_child[0] == 'layer4':
                # if named_child[0] == 'fc':
                for param in named_child[1].parameters():
                    param.requires_grad = True
        # pdb.set_trace()
    else:
        print('Recover model from {}/resnet18.pth......'.format(save_dir))
        checkpoint = utils.load_checkpoint(save_dir, 'resnet18.pth')
        model = checkpoint['model']
        state_dict = checkpoint['state_dict']
        model.load_state_dict(state_dict)
        step = checkpoint['step']

    model.to(device)
    summary(model, (3, args.n_frames_per_clip, 112, 112))

    # pdb.set_trace()

    model.train()

    # determine optimizer
    criterion = nn.CrossEntropyLoss()
    fc_lr_layers = list(map(id, model.module.fc.parameters()))
    pretrained_lr_layers = [
        p for p in model.parameters()
        if id(p) not in fc_lr_layers and p.requires_grad == True
    ]
    # pretrained_lr_layers = filter(lambda p:
    #                               id(p) not in fc_lr_layers, model.parameters())
    optimizer = torch.optim.SGD([{
        "params": model.module.fc.parameters()
    }, {
        "params": pretrained_lr_layers,
        "lr": 1e-4,
        'weight_decay': 1e-3
    }],
                                lr=1e-3,
                                momentum=0.9,
                                weight_decay=1e-2)

    train_logger = utils.Logger(
        os.path.join('output', 'R3D-fine-tune-all.log'), [
            'step', 'train_loss', 'train_acc', 'val_loss', 'val_acc',
            'lr_feature', 'lr_fc'
        ])
    scheduler = lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.1)
    # scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, 'min', factor=0.5, patience=2)
    train_loss = utils.AverageMeter()
    train_acc = utils.AverageMeter()
    val_loss = utils.AverageMeter()
    val_acc = utils.AverageMeter()
    for epoch in trange(num_epochs):  # loop over the dataset multiple times
        train_loss.reset()
        train_acc.reset()
        for data in dataloader_train:
            inputs, masks, labels = data
            inputs, labels = inputs.to(device,
                                       non_blocking=True).float(), labels.to(
                                           device, non_blocking=True).long()
            optimizer.zero_grad()
            outputs = model(inputs)
            loss_ = criterion(outputs, labels)
            loss_.backward()
            optimizer.step()
            train_loss.update(loss_.item())
            train_acc.update(utils.calculate_accuracy(outputs, labels))
            if step % 50 == 0:
                val_loss.reset()
                val_acc.reset()
                model.eval()
                for data_val in dataloader_val:
                    inputs_val, masks_val, labels_val = data_val
                    inputs_val, labels_val = inputs_val.to(device, non_blocking=True).float(), \
                                            labels_val.to(device, non_blocking=True).long()
                    outputs_val = model(inputs_val)
                    val_loss_ = criterion(outputs_val, labels_val)
                    val_loss.update(val_loss_.item())
                    val_acc.update(
                        utils.calculate_accuracy(outputs_val, labels_val))
                model.train()
                print(
                    'epoch{}/{} train_acc:{:.3f} train_loss:{:.3f} val_acc:{:.3f} val_loss:{:.3f}'
                    .format(epoch + 1, num_epochs, train_acc.val,
                            train_loss.val, val_acc.avg, val_loss.avg))
                train_logger.log({
                    'step': step,
                    'train_loss': train_loss.val,
                    'train_acc': train_acc.val,
                    'val_loss': val_loss.avg,
                    'val_acc': val_acc.avg,
                    # 'lr_feature': optimizer.param_groups[1]['lr'],
                    'lr_feature': 0,
                    'lr_fc': optimizer.param_groups[0]['lr']
                })

            if step % 200 == 0:
                utils.save_checkpoint(model, optimizer, step, save_dir,
                                      'resnet18.pth')
            step += 1
        scheduler.step()
def train_epoch(epoch: int, data_loader: DataLoader, model: torch.nn.Module,
                criterion: CrossEntropyLoss, optimizer: torch_optimizer,
                opt: Namespace, epoch_logger: Logger, result_dir_name: str,
                device: torch.device):
    print(f'train at epoch {epoch}')

    model.train()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()
    if opt.show_top5:
        accuracies5 = AverageMeter()
    else:
        accuracies5 = None

    end_time = time.time()
    epoch_time = time.time()
    for i, (inputs, targets) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        targets = targets.to(device, non_blocking=True)
        inputs = Variable(inputs)
        targets = Variable(targets)
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        losses.update(loss.item(), inputs.size(0))

        if opt.show_top5:
            acc1, acc5 = calculate_accuracy_1_5(outputs, targets)
            accuracies.update(acc1, inputs.size(0))
            accuracies5.update(acc5, inputs.size(0))
        else:
            acc1 = calculate_accuracy(outputs, targets)
            accuracies.update(acc1, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        if opt.show_top5:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Acc-Top1 {acc.val:.3f} ({acc.avg:.3f})\t'
                  'Acc-Top5 {acc5.val:.3f} ({acc5.avg:.3f))\t'.format(
                      epoch,
                      i + 1,
                      len(data_loader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      acc=accuracies,
                      acc5=accuracies5))
        else:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Acc-Top1 {acc.val:.3f} ({acc.avg:.3f})\t'.format(
                      epoch,
                      i + 1,
                      len(data_loader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      acc=accuracies))

    epoch_time = time.time() - epoch_time

    if opt.show_top5:
        epoch_logger.log({
            'epoch': epoch,
            'loss': losses.avg,
            'acc-top1': accuracies.avg,
            'acc-top5': accuracies5.avg,
            'lr': optimizer.param_groups[0]['lr'],
            'batch': opt.batch_size,
            'batch-time': batch_time.avg,
            'epoch-time': epoch_time
        })
    else:
        epoch_logger.log({
            'epoch': epoch,
            'loss': losses.avg,
            'acc-top1': accuracies.avg,
            'lr': optimizer.param_groups[0]['lr'],
            'batch': opt.batch_size,
            'batch-time': batch_time.avg,
            'epoch-time': epoch_time
        })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(result_dir_name,
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)
Exemple #13
0
def main():
    '''
    Train function.
    '''
    os.environ[
        'TORCH_HOME'] = t_cfg.MODEL_PATH  #set the env variable so the model is downloaded inside this folder.

    ########################################################## Model Initialization & Loading ##########################################################
    model_instance = model.Model(model_download_path=t_cfg.MODEL_PATH,
                                 new_model_name=t_cfg.MODEL_NAME,
                                 input_feature_size=t_cfg.FEATURE_INPUT_SIZE,
                                 num_class=t_cfg.NUM_CLASSES)

    vgg_model = model_instance()

    optimizer = Adam(vgg_model.parameters(),
                     lr=t_cfg.LEARNING_RATE)  #optimizer
    lr_decay = lr_scheduler.ExponentialLR(
        optimizer, gamma=t_cfg.LR_DECAY_RATE
    )  #scheduler is used to lower the learning rate during training later.
    loss_criterion = torch.nn.CrossEntropyLoss()  #loss function.

    vgg_model = vgg_model.to(
        t_cfg.DEVICE)  #move the network to GPU if available.

    print("--- Model Architecture ---")
    print(vgg_model)

    ########################################################## Data Initialization & Loading ##########################################################
    #Initialize the training data class.
    training_data = LoadDataset(
        resized_image_size=t_cfg.RESIZED_IMAGE_SIZE,
        total_images=t_cfg.TOTAL_DATA,
        classes=t_cfg.CLASSES,
        data_list=t_cfg.IMG_LABEL_LIST,
        transform=transforms.Compose([
            RandomRotate(angle_range=t_cfg.ROTATION_RANGE,
                         prob=t_cfg.ROTATION_PROB),
            RandomShear(shear_range=t_cfg.SHEAR_RANGE, prob=t_cfg.SHEAR_PROB),
            RandomHorizontalFlip(prob=t_cfg.HFLIP_PROB),
            RandomVerticalFlip(prob=t_cfg.VFLIP_PROB),
            RandomNoise(mode=t_cfg.NOISE_MODE, prob=t_cfg.NOISE_PROB),
            ToTensor(mode='training')
        ]))

    dataloader = DataLoader(training_data,
                            batch_size=t_cfg.BATCH_SIZE,
                            shuffle=t_cfg.DATA_SHUFFLE,
                            num_workers=t_cfg.NUM_WORKERS)

    ########################################################## Model Training & Saving ##########################################################
    best_accuracy = 0

    entire_loss_list = []
    entire_accuracy_list = []

    for epoch_idx in range(t_cfg.EPOCH):

        print("Training for epoch %d has started!" % (epoch_idx + 1))

        epoch_training_loss = []
        epoch_accuracy = []
        i = 0
        for i, sample in tqdm(enumerate(dataloader)):

            batch_x, batch_y = sample['image'].to(
                t_cfg.DEVICE), sample['label'].to(t_cfg.DEVICE)

            optimizer.zero_grad(
            )  #clear the gradients in the optimizer between every batch.

            net_output = vgg_model(batch_x)  #output from the network.

            total_loss = loss_criterion(input=net_output, target=batch_y)

            epoch_training_loss.append(
                total_loss.item())  #append the loss of every batch.

            total_loss.backward()  #calculate the gradients.
            optimizer.step()

            batch_acc = calculate_accuracy(network_output=net_output,
                                           target=batch_y)
            epoch_accuracy.append(batch_acc.cpu().numpy())

        lr_decay.step()  #decay rate update
        curr_accuracy = sum(epoch_accuracy) / i
        curr_loss = sum(epoch_training_loss)

        print("The accuracy at epoch %d is %g" % (epoch_idx, curr_accuracy))
        print("The loss at epoch %d is %g" % (epoch_idx, curr_loss))

        entire_accuracy_list.append(curr_accuracy)
        entire_loss_list.append(curr_loss)

        if curr_accuracy > best_accuracy:

            torch.save(vgg_model.state_dict(), t_cfg.SAVE_PATH)
            best_accuracy = curr_accuracy
            print("Model is saved !")

    ########################################################## Graphs ##########################################################
    if t_cfg.PLOT_GRAPH:
        plot_graph(t_cfg.EPOCH, "Epoch", "Training Loss",
                   "Training Loss for %d epoch" % (t_cfg.EPOCH), "./loss.png",
                   [entire_loss_list, 'r--', "Loss"])
        plot_graph(t_cfg.EPOCH, "Epoch", "Training Accuracy",
                   "Training Accuracy for %d epoch" % (t_cfg.EPOCH),
                   "./accuracy.png", [entire_accuracy_list, 'b--', "Accuracy"])
def train_epoch(epoch, fold_id, data_loader, model, criterion, optimizer, opt,
                epoch_logger, batch_logger, writer):
    print('train at epoch {}'.format(epoch))

    model.train()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    writer = writer
    end_time = time.time()
    for i, (inputs, labels) in enumerate(data_loader):
        data_time.update(time.time() - end_time)
        labels = list(map(int, labels))
        inputs = torch.unsqueeze(inputs, 1)  #在 1 的位置加一个维度
        inputs = inputs.type(torch.FloatTensor)
        if not opt.no_cuda:
            labels = torch.LongTensor(labels).cuda(async=True)
        inputs = Variable(inputs)
        labels = Variable(labels)
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        acc = calculate_accuracy(outputs, labels)

        losses.update(loss.data, inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i - 1),
            'loss': round(losses.val.item(), 4),
            'acc': round(accuracies.val.item(), 4),
            'lr': optimizer.param_groups[0]['lr']
        })

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

    epoch_logger.log({
        'epoch': epoch,
        'loss': round(losses.avg.item(), 4),
        'acc': round(accuracies.avg.item(), 4),
        'lr': optimizer.param_groups[0]['lr']
    })

    writer.add_scalar('train/loss', losses.avg, epoch)
    writer.add_scalar('train/accuracy', accuracies.avg, epoch)

    if opt.save_weight:
        if epoch % opt.checkpoint == 0:
            save_dir = OsJoin(opt.result_path, opt.data_type,
                              opt.model_name + str(opt.model_depth),
                              'weights_fold%s' % fold_id)
            if not os.path.exists(save_dir):
                os.makedirs(save_dir)
            save_path = OsJoin(
                save_dir, '{}{}_weights_fold{}_epoch{}.pth'.format(
                    opt.model_name, opt.model_depth, fold_id, epoch))
            states = {
                'fold': fold_id,
                'epoch': epoch,
                'arch': opt.arch,
                'state_dict': model.state_dict(),
                'optimizer': optimizer.state_dict(),
            }
            torch.save(states, save_path)
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()
    cls_losses = AverageMeter()
    op_losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()
    for i, (inputs, proposal, targets) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        # if not opt.no_cuda:
        # targets = targets.cuda(async=True)
        with torch.no_grad():
            inputs = Variable(inputs)
            proposal = Variable(proposal.float())
            outputs, op_loss = model(inputs, proposal, training=False)
        # targets = Variable(targets, volatile=True)
        # targets = targets.data.cpu()

        outputs = outputs.data.cpu()
        cls_loss = criterion(outputs, targets)
        op_loss = op_loss.data.cpu()
        loss = cls_loss + opt.op_loss_weight * op_loss.mean()
        acc = calculate_accuracy(outputs, targets)

        losses.update(loss.data[0], inputs.size(0))
        cls_losses.update(cls_loss.data.cpu()[0], inputs.size(0))
        op_losses.update(op_loss.data.cpu()[0], inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        if (i + 1) % opt.log_step == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'CLSLoss {cls_loss.val:.4f} ({cls_loss.avg:.4f})\t'
                  'OPLoss {op_loss.val:.4f} ({op_loss.avg:.4f})\t'
                  'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                      epoch,
                      i + 1,
                      len(data_loader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      cls_loss=cls_losses,
                      op_loss=op_losses,
                      acc=accuracies),
                  flush=True)

    logger.log({'epoch': epoch, 'loss': losses.avg, 'acc': accuracies.avg})

    return losses.avg
Exemple #16
0
def val_epoch_true(epoch, data_loader, model, criterion, opt, logger):
    print('validation at epoch {}'.format(epoch))

    model.eval()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()
    precisions = AverageMeter()  #
    recalls = AverageMeter()

    end_time = time.time()
    vid_ids = data_loader.dataset.ids
    vid_ids.append(-1)
    out_queue = []
    for i, (inputs, targets) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        if not opt.no_cuda:
            targets = targets.cuda(async=True)
        with torch.no_grad():
            inputs = Variable(inputs)
            targets = Variable(targets)
            outputs = model(inputs)
            outputs = F.softmax(outputs, dim=1)
            outputs = outputs.cpu().numpy()[0].reshape(-1, )
            out_queue.append(outputs)

        if vid_ids[i + 1] != vid_ids[i]:
            output = np.mean(out_queue, 0)
            outputs = torch.from_numpy(output).float().unsqueeze_(0).cuda()
            loss = criterion(outputs, targets)
            acc = calculate_accuracy(outputs, targets)
            precision = calculate_precision(outputs, targets)
            recall = calculate_recall(outputs, targets)

            losses.update(loss.item(), inputs.size(0))
            accuracies.update(acc, inputs.size(0))
            precisions.update(precision, inputs.size(0))
            recalls.update(recall, inputs.size(0))

            batch_time.update(time.time() - end_time)
            end_time = time.time()
            out_queue = []

            if i % 100 == 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'
                      'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                          epoch,
                          i + 1,
                          len(data_loader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          acc=accuracies))

    logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'precision': precisions.avg,
        'recall': recalls.avg
    })

    return losses.avg, accuracies.avg
Exemple #17
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, logger=None):
    print('train at epoch {}'.format(epoch))

    model.train()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()
    for i, (inputs, targets) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        if torch.cuda.is_available():
            targets = targets.cuda(async=True)

            inputs = inputs.cuda()
            targets = targets.cuda()

        # inputs = Variable(inputs)
        # targets = Variable(targets)
        torch.cuda.synchronize()

        outputs = model(inputs)
        loss = criterion(outputs, targets)
        acc = calculate_accuracy(outputs, targets)

        losses.update(loss.data[0], inputs.size(0))
        accuracies.update(acc, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        torch.cuda.synchronize()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        # batch_logger.log({
        #     'epoch': epoch,
        #     'batch': i + 1,
        #     'iter': (epoch - 1) * len(data_loader) + (i + 1),
        #     'loss': losses.val,
        #     'acc': accuracies.val,
        #     'lr': optimizer.param_groups[0]['lr']
        # })

        print('Train: Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

        if logger is not None:
            current_step = epoch * len(data_loader) + i
            logger.add_scalar('Train/Loss', losses.avg, current_step)
            logger.add_scalar('Train/Acc', accuracies.avg, current_step)
def test(model, load_dir, ExemplarSet_file, checkpoint_file, dataloader, class_id1, class_id2):
    in_features = model.module.fc.in_features
    out_features = model.module.fc.out_features
    # model.module.fc = nn.Linear(in_features, len(class_id1)+len(class_id2), bias=False)
    model.module.fc = nn.Linear(in_features, len(class_id1)+len(class_id2))
    model.to(device)
    print('Start testing for class {}.....'.format(range(class_id1[0], class_id2[-1])))
    print('Model {} and exemplar sets {} loaded'.format(checkpoint_file, ExemplarSet_file))
    ExemplarSet_file = os.path.join(load_dir, ExemplarSet_file)
    checkpoint_file = os.path.join(load_dir, checkpoint_file)
    with open(ExemplarSet_file, 'rb') as f:
        exemplar_sets = pickle.load(f)

    checkpoint = torch.load(checkpoint_file)
    # model = checkpoint['model']
    model.load_state_dict(checkpoint['state_dict'])
    model.eval()

    print('Computing exemplar means for {} classes........'.format(len(exemplar_sets)))
    exemplar_means = compute_mean(model, exemplar_sets)

    acc = utils.AverageMeter()
    acc_class = utils.AverageMeter()
    acc_class_cache = []
    for class_i, dataloader_i in enumerate(dataloader):
        acc_class.reset()
        for data in dataloader_i:   
            inputs, labels = data
            inputs = inputs.to(device, non_blocking=True).float()
            preds = classfier(model, exemplar_means, inputs)
            acc.update(utils.calculate_accuracy_ForIcarl(preds, labels))
            acc_class.update(utils.calculate_accuracy_ForIcarl(preds, labels))
        acc_class_cache.append(acc_class.avg)
    print('Accuracy for old classes:')
    print(acc_class_cache[0])
    print('Accuracy for new classes:')
    print(acc_class_cache[1])
    print('Mean accuracy')
    print(acc.avg)


    acc.reset()
    acc_class.reset()
    acc_class_cache = []
    for class_i, dataloader_i in enumerate(dataloader):
        acc_class.reset()
        for data in dataloader_i:   
            inputs, labels = data
            inputs = inputs.to(device, non_blocking=True).float()
            labels = labels.to(device, non_blocking=True)
            probs, logits = model(inputs)
            acc.update(utils.calculate_accuracy(probs, labels))
            acc_class.update(utils.calculate_accuracy(probs, labels))
        acc_class_cache.append(acc_class.avg)
    print('\n')
    print('Accuracy for old classes:')
    print(acc_class_cache[0])
    print('Accuracy for new classes:')
    print(acc_class_cache[1])
    print('Mean accuracy')
    print(acc.avg)
    del inputs, labels, probs, logits, model
    torch.cuda.empty_cache()
Exemple #19
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, opt,
                epoch_logger, batch_logger):
    print('train at epoch {}'.format(epoch))

    model.train()

    cuda = torch.device("cuda")

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()
    for i, (video, audio) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        video = video.to(device=cuda)
        audio = audio.to(device=cuda)
        bs = video.size(0)
        device = video.device

        #feature_v, feature_a = model(video, audio)
        #target = torch.arange(bs).to(device=device)
        #cosv2a = torch.mm(feature_a, feature_v.t()).t()
        #cosa2v = torch.mm(feature_v, feature_a.t()).t()

        #loss1 = criterion(cosv2a, target)
        #loss2 = criterion(cosa2v, target)
        #loss = loss1 + loss2

        #tmp = cosv2a.argmax(dim=1)
        #acc = calculate_accuracy(cosv2a, target)

        #fc_correct, fc_wrong = model(video, audio)
        dot_va, dot_av, label_va, label_av = model(video, audio)
        #fc = torch.cat([fc_correct, fc_wrong], dim=0)
        #target = torch.cat([torch.ones((bs, ), dtype=torch.long), torch.zeros((bs, ), dtype=torch.long)], dim=0)
        #target = target.to(device=device)
        #loss = criterion(fc, target)
        loss = criterion(dot_va, label_va) + criterion(dot_av, label_av)
        acc = calculate_accuracy(dot_va, label_va)

        losses.update(loss.data.item(), video.size(0))
        accuracies.update(acc, video.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        batch_logger.log({
            'epoch': epoch,
            'batch': i + 1,
            'iter': (epoch - 1) * len(data_loader) + (i + 1),
            'loss': losses.val,
            'acc': accuracies.val,
            'lr': optimizer.param_groups[0]['lr']
        })

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         data_time=data_time,
                                                         loss=losses,
                                                         acc=accuracies))

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(opt.result_path,
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)
Exemple #20
0
loss = utils.cross_entropy_loss(output, label)

train = tf.train.AdamOptimizer(0.001).minimize(loss)

global_vars_init_op = tf.global_variables_initializer()
local_vars_init_op = tf.local_variables_initializer()
combined_op = tf.group(local_vars_init_op, global_vars_init_op)
model_variables = slim.get_model_variables()
saver = tf.train.Saver(model_variables)

with tf.Session() as sess:
    sess.run(combined_op)
    # saver.restore(sess, '/home/kris/PycharmProjects/traffic_sign_recognition/lenet_parameters.ckpt')
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    for i in range(50000):
        ignore, pred, error, images, truth = sess.run([train, output, loss, image_batch, label_batch])
        #for i in range(len(images)):
        #    cv2.imshow("image" + str(i), cv2.resize(images[i], (256, 256)));
        #    print(truth[i])
        #cv2.waitKey(0)
        accuracy = utils.calculate_accuracy(pred, truth)
        print("%d round loss = %f, accuracy = %f" % (i, error, accuracy))
        if i % 199 == 0:
            saver.save(sess, '/home/kris/PycharmProjects/traffic_sign_recognition/lenet_parameters.ckpt')
    coord.request_stop()
    coord.join(threads)

saver.save(sess, '/home/kris/PycharmProjects/traffic_sign_recognition/lenet_parameters.ckpt')
Exemple #21
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, opt,
                epoch_logger, batch_logger, writer):
    print('train at epoch {}'.format(epoch))

    model.train()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()

    dataset = "ucf"
    if opt.dataset == "hmdb51":
        dataset = "hmdb"

    end_time = time.time()
    for i, (inputs, targets) in enumerate(data_loader):
        acc = 0
        data_time.update(time.time() - end_time)

        if not opt.no_cuda:
            targets = targets.cuda(async=True)
        if opt.dataset == "hmdb51":
            targets -= 1

        outputs = model(inputs.cuda())
        loss = criterion(outputs, targets)

        losses.update(loss.item(), inputs.size(0))

        acc = calculate_accuracy(outputs, targets)
        accuracies.update(acc, inputs.size(0))

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        writer.add_scalar('%s/train_loss' % dataset, losses.val, (epoch - 1) * len(data_loader) + (i + 1))

        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                  epoch,
                  i + 1,
                  len(data_loader),
                  batch_time=batch_time,
                  data_time=data_time,
                  loss=losses,
                  acc=accuracies))

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join(opt.result_path,
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)
Exemple #22
0
def val_epoch(epoch, data_loader, model, criterion, args, device,
              epoch_logger):
    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top3 = AverageMeter()

    # switch to evaluate mode
    model.eval()

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

        input = input.to(device)
        target = target.to(device)

        # compute output and loss
        output = model(input)
        loss = criterion(output, target)

        # measure accuracy and record loss
        prec1, prec3 = calculate_accuracy(output, target, topk=(1, 3))
        losses.update(loss.item(), input.size(0))
        top1.update(prec1[0].item(), input.size(0))
        top3.update(prec3[0].item(), input.size(0))

        # measure elapsed time
        batch_time.update(time.time() - end_time)
        end_time = time.time()

        if (i + 1) % args.log_interval == 0:
            print('Valid Epoch [{0}/{1}]([{2}/{3}])\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t'
                  'Prec@3 {top3.val:.3f} ({top3.avg:.3f})\t'
                  'Batch Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data Time {data_time.val:.3f} ({data_time.avg:.3f})'.format(
                      epoch,
                      args.epochs,
                      i + 1,
                      len(data_loader),
                      loss=losses,
                      top1=top1,
                      top3=top3,
                      batch_time=batch_time,
                      data_time=data_time))

    print(' * Prec@1 {top1.avg:.2f}% | Prec@3 {top3.avg:.2f}%'.format(
        top1=top1, top3=top3))

    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'top1': top1.avg,
        'top3': top3.avg
    })

    vis.plot('Val loss', losses.avg)
    vis.plot('Val accu', top1.avg)

    return losses.avg, top1.avg
def run_epoch_pass(mode, dataloader, model, criterion, optimizer):
    """Perform one train or test pass through the data (epoch)
    """
    batch_time = AverageMeter("Batch Time")
    data_time = AverageMeter("Data Time")
    losses = AverageMeter("Losses")
    top1 = AverageMeter("Top 1 Accuracy")
    top5 = AverageMeter("Top 5 Accuracy")
    end = time()

    if mode == "Train":
        model.train()
    elif mode == "Test":
        model.eval()
    else:
        assert mode in ("Train", "Test"), f"Unsupported mode {mode}"

    bar = Bar(mode, max=len(dataloader))
    for batch_idx, (inputs, targets) in enumerate(dataloader):
        # measure data loading time
        data_time.update(time() - end)
        if USE_CUDA:
            inputs, targets = inputs.cuda(), targets.cuda()

        # compute output
        outputs = model(inputs)
        loss = criterion(outputs, targets)

        # measure accuracy and record loss
        # pylint: disable=unbalanced-tuple-unpacking
        prec1, prec5 = calculate_accuracy(outputs.data,
                                          targets.data,
                                          topk=(1, 5))
        losses.update(loss.data.item(), inputs.size(0))
        top1.update(prec1.item(), inputs.size(0))
        top5.update(prec5.item(), inputs.size(0))

        if mode == "Train":
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        # measure elapsed time
        batch_time.update(time() - end)
        end = time()

        # plot progress
        bar.suffix = "({batch}/{size}) Data: {data:.3f}s | Batch: {bt:.3f}s | Total: {total:} | ETA: {eta:} | Loss: {loss:.4f} | top1: {top1: .4f} | top5: {top5: .4f}".format(
            batch=batch_idx + 1,
            size=len(dataloader),
            data=data_time.avg,
            bt=batch_time.avg,
            total=bar.elapsed_td,
            eta=bar.eta_td,
            loss=losses.avg,
            top1=top1.avg,
            top5=top5.avg,
        )
        bar.next()
    bar.finish()
    return (losses.avg, top1.avg)
Exemple #24
0
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()
    accuracies = AverageMeter()

    end_time = time.time()
    
    #########  temp line, needs to be removed##################################
    file  = 'epoch_'+ str(epoch)+'_validation_matrix.csv'
    confusion_matrix = np.zeros((opt.n_classes,opt.n_classes))
    confidence_for_each_validation = {}
    ###########################################################################
    
    #pdb.set_trace()
    for i, (inputs, targets, paths) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        if not opt.no_cuda:
            targets = targets.cuda(non_blocking=True)
        with torch.no_grad():
            
            inputs = Variable(inputs)
            targets = Variable(targets)
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            acc = calculate_accuracy(outputs, targets)
            #########  temp line, needs to be removed##################################
            for j in range(len(targets)):
                confidence_for_each_validation[paths[j]] = [x.item() for x in outputs[j]]
            
            rows = [int(x) for x in targets]
            columns = [int(x) for x in torch.argmax(outputs, 1)]
            assert len(rows) == len(columns)
            for idx in range(len(rows)):
                confusion_matrix[rows[idx]][columns[idx]] += 1
            
            ###########################################################################
            losses.update(loss.data, inputs.size(0))
            accuracies.update(acc, inputs.size(0))

            batch_time.update(time.time() - end_time)
            end_time = time.time()

            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                      epoch,
                      i + 1,
                      len(data_loader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      acc=accuracies))
    #########  temp line, needs to be removed##################################
    print(confusion_matrix)
    confusion_matrix = pd.DataFrame(confusion_matrix)
    confusion_matrix.to_csv(opt.result_path + 'ConfusionMatrix_' + str(epoch) + '.csv')
    confidence_matrix = pd.DataFrame.from_dict(confidence_for_each_validation, orient='index')
    confidence_matrix.to_csv(opt.result_path + 'ConfidenceMatrix.csv')
    
    #########  temp line, needs to be removed##################################
    
    
    logger.log({'epoch': epoch, 'loss': losses.avg, 'acc': accuracies.avg})

    return losses.avg
Exemple #25
0
def train_epoch(epoch, data_loader, model, criterion, optimizer, opt,
                epoch_logger):
    print('train at epoch {}'.format(epoch))

    model.train()

    batch_time = AverageMeter()  #このepochにおける1iterにかかる時間
    losses = AverageMeter()  #このepochにおける1iterのlossとlossの平均を保持
    accuracies = AverageMeter()  #このepochにおける1iterのaccuraciesとaccuraciesの平均を保持

    device = torch.device("cuda")  #マルチGPUを使う場合の呪文
    end_time = time.time()
    #以下学習フロー
    for i, (inputs, targets, video_ids) in enumerate(data_loader):
        model.zero_grad()  #モデルの勾配をゼロに
        inputs = inputs.to(
            device)  #マルチGPUの場合の手続き,これをしないと各GPUに分けてデータをのせることができない
        targets = targets.squeeze(1)  #tensor(10,1)からtensor(10)の1次元テンソルへ変換
        targets = targets.cuda()  #cudaへ
        outputs = model(
            inputs
        )  #inputs:(バッチサイズ, チャンネル数(3), フレーム数(16), width(114), height(114))をモデルに入力し,outputs:(バッチサイズ, 各クラス尤度)を返すforward計算
        loss = criterion(
            outputs, targets
        )  #outputsとtargetsのLOSSを計算,クラスエントロピーなので正解次元の推定尤度のlogにマイナスを乗じた値のバッチごとの平均がLOSSになる
        acc = calculate_accuracy(outputs,
                                 targets)  #outputsとtargetsからバッチの中でどれだけ正解したか出力

        losses.update(loss.item(), inputs.size(
            0))  #このiterにおけるlossとこのepochにおけるこれまでのiterにおけるlossの平均を計算し保持
        accuracies.update(acc, inputs.size(
            0))  #このiterにおけるaccとこのepochにおけるこれまでのiterにおけるaccの平均を計算し保持

        optimizer.zero_grad()  #optimizerの勾配をゼロに
        loss.backward()  #backward計算で勾配を算出
        optimizer.step()  #算出した勾配から重みを更新

        batch_time.update(
            time.time() -
            end_time)  #このiterでかかった時間を算出しこのepochにおけるこれまでのiterでかかった時間の平均を計算し保持
        end_time = time.time()  #時間を更新

        #各種情報を表示
        """
        print('Epoch: [{0}][{1}/{2}]\t'.format(
                  epoch,
                  i + 1,
                  len(data_loader)
                  ))
        """
        print('Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(epoch,
                                                         i + 1,
                                                         len(data_loader),
                                                         batch_time=batch_time,
                                                         loss=losses,
                                                         acc=accuracies))

    #epoch数,このepochにおけるlossの平均,このepochにおけるacc平均,このepochにおける学習率をtrain.logへ書き込む
    epoch_logger.log({
        'epoch': epoch,
        'loss': losses.avg,
        'acc': accuracies.avg,
        'lr': optimizer.param_groups[0]['lr']
    })

    if epoch % opt.checkpoint == 0:
        save_file_path = os.path.join("./result/learned_weight_day1-3_1-6_rgb",
                                      'save_{}.pth'.format(epoch))
        states = {
            'epoch': epoch + 1,
            'arch': opt.arch,
            'state_dict': model.state_dict(),
            'optimizer': optimizer.state_dict(),
        }
        torch.save(states, save_file_path)
def val_epoch(epoch, data_set, model, criterion, optimizer, opt, logger):
    print('validation at epoch {}'.format(epoch))

    model.eval()

    losses = AverageMeter()
    accuracies = AverageMeter()

    data_set.file_open()
    valildation_loader = torch.utils.data.DataLoader(
        dataset=data_set,
        batch_size=opt["validation_batch_size"],
        shuffle=False,
        pin_memory=True)
    val_process = tqdm(valildation_loader)
    start_time = time.time()
    for i, (inputs, targets) in enumerate(val_process):
        if i > 0:
            val_process.set_description("Loss: %.4f, Acc: %.4f" %
                                        (losses.avg, accuracies.avg))
        if opt["cuda_devices"] is not None:
            #targets = targets.cuda(async=True)
            inputs = inputs.type(torch.FloatTensor)
            inputs = inputs.cuda()
            targets = targets.type(torch.FloatTensor)
            targets = targets.cuda()
        with torch.no_grad():
            if opt["VAE_enable"]:
                outputs, distr = model(inputs)
                loss = criterion(outputs, targets, distr)
            else:
                outputs = model(inputs)
                loss = criterion(outputs, targets)

        acc = calculate_accuracy(outputs.cpu(), targets.cpu())

        losses.update(loss.cpu(), inputs.size(0))
        accuracies.update(acc, inputs.size(0))

    epoch_time = time.time() - start_time
    data_set.file_close()
    print("validation: epoch:{0}\t seg_acc:{1:.4f} \t using:{2:.3f} minutes".
          format(epoch, accuracies.avg, epoch_time / 60))

    logger.log(phase="val",
               values={
                   'epoch': epoch,
                   'loss': format(losses.avg.item(), '.4f'),
                   'acc': format(accuracies.avg.item(), '.4f'),
                   'lr': optimizer.param_groups[0]['lr']
               })

    with open("runs/val_log/log.txt", "a+") as file:
        file.write({
            'epoch': epoch,
            'loss': format(losses.avg.item(), '.4f'),
            'acc': format(accuracies.avg.item(), '.4f'),
            'lr': optimizer.param_groups[0]['lr']
        }.__str__() + "\n")

    return losses.avg, accuracies.avg
Exemple #27
0
def test(model, test_loader, test_batch_logger, test_logger, badcase_npy):
    model.eval()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    accuracies = AverageMeter()
    end_time = time.time()
    accuracies_chexing = AverageMeter()
    accuracies_ori = AverageMeter()

    accuracies = AverageMeter()
    print('----------开始测试----------')

    badcase_keys = []
    with torch.no_grad():
        for i, (inputs, targets, keys) in enumerate(test_loader):
            data_time.update(time.time() - end_time)

            targets = targets.numpy().tolist()
            targets = [label_2_gt[str(target)] for target in targets]

            labels_chexing = [
                int(gt_2_chexing[str(target)]) for target in targets
            ]
            labels_ori = [int(gt_2_ori[str(target)]) for target in targets]

            labels_chexing = torch.tensor(labels_chexing)
            labels_ori = torch.tensor(labels_ori)
            out_chexing, out_ori = model(inputs)

            # acc = calculate_accuracy(out_chexing, labels_chexing)
            acc_chexing = calculate_accuracy(out_chexing, labels_chexing)
            acc_ori = calculate_accuracy(out_ori, labels_ori)
            acc = calculate_union_accuracy((out_chexing, out_ori),
                                           (labels_chexing, labels_ori))
            badcase = find_badcase((out_chexing, out_ori),
                                   (labels_chexing, labels_ori), keys)

            badcase_keys.extend(badcase)

            accuracies_chexing.update(acc_chexing, inputs.size(0))
            accuracies_ori.update(acc_ori, inputs.size(0))
            #
            # accuracies_midbrand.update(acc_midbrand, inputs.size(0))
            accuracies.update(acc, inputs.size(0))

            batch_time.update(time.time() - end_time)
            end_time = time.time()

            # test_batch_logger.log({
            # 	'batch': i + 1,
            # 	'acc': accuracies.val,
            # })

            print('test iter: {}/{}\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                  'Acc_chexing {acc_chexing.val:.3f} ({acc_chexing.avg:.3f})\t'
                  'Acc_ori {acc_ori.val:.3f} ({acc_ori.avg:.3f})\t'
                  'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                      i + 1,
                      len(test_loader),
                      batch_time=batch_time,
                      data_time=data_time,
                      acc_chexing=accuracies_chexing,
                      acc_ori=accuracies_ori,
                      acc=accuracies))
            np.save(badcase_npy, badcase_keys)
def val_epoch(epoch: int, data_loader: DataLoader, model: torch.nn.Module,
              criterion: CrossEntropyLoss, opt: Namespace,
              epoch_logger: Logger, device: torch.device):
    print(f'validation at epoch {epoch}')

    model.eval()

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    accuracies = AverageMeter()
    if opt.show_top5:
        accuracies5 = AverageMeter()
    else:
        accuracies5 = None

    end_time = time.time()
    epoch_time = time.time()
    with torch.no_grad():
        for i, (inputs, targets) in enumerate(data_loader):
            data_time.update(time.time() - end_time)

            targets = targets.to(device, non_blocking=True)
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            losses.update(loss.item(), inputs.size(0))

            if opt.show_top5:
                acc1, acc5 = calculate_accuracy_1_5(outputs, targets)
                accuracies.update(acc1, inputs.size(0))
                accuracies5.update(acc5, inputs.size(0))
            else:
                acc1 = calculate_accuracy(outputs, targets)
                accuracies.update(acc1, inputs.size(0))

            batch_time.update(time.time() - end_time)
            end_time = time.time()

            if opt.show_top5:
                print('Epoch: [{0}][{1}/{2}]\t'
                      'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                      'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                      'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                      'Acc-Top1 {acc.val:.3f} ({acc.avg:.3f})\t'
                      'Acc-Top5 {acc5.val:.3f} ({acc5.avg:.3f))\t'.format(
                          epoch,
                          i + 1,
                          len(data_loader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          acc=accuracies,
                          acc5=accuracies5))
            else:
                print('Epoch: [{0}][{1}/{2}]\t'
                      'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                      'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                      'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                      'Acc-Top1 {acc.val:.3f} ({acc.avg:.3f})\t'.format(
                          epoch,
                          i + 1,
                          len(data_loader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          acc=accuracies))

    epoch_time = time.time() - epoch_time

    if opt.show_top5:
        epoch_logger.log({
            'epoch': epoch,
            'loss': losses.avg,
            'acc-top1': accuracies.avg,
            'acc-top5': accuracies5.avg,
            'batch': opt.batch_size,
            'batch-time': batch_time.avg,
            'epoch-time': epoch_time
        })
    else:
        epoch_logger.log({
            'epoch': epoch,
            'loss': losses.avg,
            'acc-top1': accuracies.avg,
            'batch': opt.batch_size,
            'batch-time': batch_time.avg,
            'epoch-time': epoch_time
        })
Exemple #29
0
def val_epoch(epoch,
              data_loader,
              model,
              criterion,
              device,
              logger,
              is_master_node,
              tb_writer=None,
              distributed=False):
    print('validation at epoch {}'.format(epoch))

    model.eval()

    batch_time = AverageMeter()
    data_time = AverageMeter()

    # losses_chexing = AverageMeter()
    # losses_ori = AverageMeter()
    losses = AverageMeter()
    #
    # losses_midbrand = AverageMeter()

    accuracies_chexing = AverageMeter()
    accuracies_ori = AverageMeter()
    #
    # accuracies_midbrand = AverageMeter()
    accuracies = AverageMeter()

    end_time = time.time()

    with torch.no_grad():
        for i, (inputs, targets) in enumerate(data_loader):
            data_time.update(time.time() - end_time)

            inputs = inputs.to(device, non_blocking=True)
            targets = targets.to(device, non_blocking=True)

            outputs = model(inputs)

            loss = criterion(outputs, targets)
            acc = calculate_accuracy(outputs, targets)

            losses.update(loss.item(), inputs.size(0))
            accuracies.update(acc, inputs.size(0))

            batch_time.update(time.time() - end_time)
            end_time = time.time()
            itera = (epoch - 1) * len(data_loader) + (i + 1)

            if is_master_node:
                print('Val Epoch: [{0}][{1}/{2}]\t'
                      'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                      'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                      'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                      'Acc {acc.val:.3f} ({acc.avg:.3f})'.format(
                          epoch,
                          i + 1,
                          len(data_loader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          acc=accuracies))

    if distributed:
        loss_sum = torch.tensor([losses.sum],
                                dtype=torch.float32,
                                device=device)
        loss_count = torch.tensor([losses.count],
                                  dtype=torch.float32,
                                  device=device)
        acc_sum = torch.tensor([accuracies.sum],
                               dtype=torch.float32,
                               device=device)
        acc_count = torch.tensor([accuracies.count],
                                 dtype=torch.float32,
                                 device=device)

        dist.all_reduce(loss_sum, op=dist.ReduceOp.SUM)
        dist.all_reduce(loss_count, op=dist.ReduceOp.SUM)
        dist.all_reduce(acc_sum, op=dist.ReduceOp.SUM)
        dist.all_reduce(acc_count, op=dist.ReduceOp.SUM)

        losses.avg = loss_sum.item() / loss_count.item()
        accuracies.avg = acc_sum.item() / acc_count.item()

    if logger is not None:
        logger.log({'epoch': epoch, 'loss': losses.avg, 'acc': accuracies.avg})
    if is_master_node:
        if tb_writer is not None:
            tb_writer.add_scalar('val/loss', losses.avg, epoch)
            tb_writer.add_scalar('val/acc', accuracies.avg, epoch)

    return losses.avg
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()
    accuracies = AverageMeter()
    accuracies_5 = AverageMeter()

    end_time = time.time()
    for i, (inputs, targets, video_id) in enumerate(data_loader):
        data_time.update(time.time() - end_time)

        print('This line has been executed')
        # print (inputs.size())

        if not opt.no_cuda:
            targets = targets.cuda(async=True)
        # inputs= Variable(inputs)
        # print (inputs.view(-1,3,inputs.size(3), inputs.size(4)).size())
        inputs = Variable(inputs.view(-1, 3, inputs.size(3), inputs.size(4)),
                          volatile=True)
        # print (inputs.size())
        targets = Variable(targets, volatile=True)
        outputs = model(inputs).mean(dim=0, keepdim=True)
        print(outputs.size())
        # outputs= outputs.view(-1,16)
        # print (outputs.size())
        # print (targets.size())

        loss = criterion(outputs, targets)
        acc, acc_5 = calculate_accuracy(outputs, targets)

        losses.update(loss.data[0], inputs.size(0))
        accuracies.update(acc, inputs.size(0))
        accuracies_5.update(acc_5, inputs.size(0))

        batch_time.update(time.time() - end_time)
        end_time = time.time()

        if opt.debug:
            if acc_5 == 0:
                print(video_id)
                print(targets)
        print('Validation, Epoch: [{0}][{1}/{2}]\t'
              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
              'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
              'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
              'Acc {acc.val:.3f} ({acc.avg:.3f})'
              'Acc_5 {acc_5.val:.3f} ({acc_5.avg:.3f})'.format(
                  epoch,
                  i + 1,
                  len(data_loader),
                  batch_time=batch_time,
                  data_time=data_time,
                  loss=losses,
                  acc=accuracies,
                  acc_5=accuracies_5))

    logger.log({
        'epoch': epoch,
        'loss': losses.avg.tolist(),
        'acc': accuracies.avg,
        'acc_5': accuracies_5.avg
    })

    return losses.avg
Exemple #31
0
        ctc_logit_matrix = preprocess_ocr_logit(ctc_logit_matrix,
                                                softmax_theta)

        # search
        predict = beam_search.search(ctc_logit_matrix)

        # post-processing
        predict = jaconv.normalize(predict)
        lbl = jaconv.normalize(lbl)

        # track
        mapping_inout_result += [(predict, lbl)]

    print("take time:", time.time() - s_time)
    """
    3. Calculating accuracy 
    """
    preds = [elem[0] for elem in mapping_inout_result]
    lbls = [elem[1] for elem in mapping_inout_result]

    # Debug & Testing
    if False:
        for input_fn, pred, lbl in zip(list(mapping_inout.keys()), preds,
                                       lbls):
            print("input_fn:",
                  os.path.split(input_fn)[-1], ",pred:", pred, ",lbl:", lbl,
                  "is_correct:", pred == lbl)

    acc_char, em = calculate_accuracy(preds, lbls)
    print("acc by char:", acc_char)
    print("em:", em)