Exemple #1
0
    def forward_backward(self, data):
        imgs, pids = self.parse_data_for_train(data)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()

        # softmax temporature
        if self.fixed_lmda or self.lmda_decay_step == -1:
            lmda = self.init_lmda
        else:
            lmda = self.init_lmda * self.lmda_decay_rate**(
                self.epoch // self.lmda_decay_step
            )
            if lmda < self.min_lmda:
                lmda = self.min_lmda

        for k in range(self.mc_iter):
            outputs = self.model(imgs, lmda=lmda)
            loss = self.compute_loss(self.criterion, outputs, pids)
            self.optimizer.zero_grad()
            loss.backward()
            self.optimizer.step()

        loss_dict = {
            'loss': loss.item(),
            'acc': metrics.accuracy(outputs, pids)[0].item()
        }

        return loss_dict
Exemple #2
0
    def forward_backward(self, data):
        imgs, pids = self.parse_data_for_train(data)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()

        outputs, features = self.model(imgs)
        loss_t = self.compute_loss(self.criterion_t, features, pids)
        loss_x = self.compute_loss(self.criterion_x, outputs, pids)
        loss = self.weight_t * loss_t + self.weight_x * loss_x

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

        # 日志输出
        loss_summary = {
            # 'loss_t': loss_t.item(),
            # 'loss_xx': loss_x.item(),
            'loss_tt': loss_t.item(),  #三元损失
            'loss_total': loss.item(),  # 总
            'acc': metrics.accuracy(outputs, pids)[0].item()
        }

        return loss_summary, loss.item()
Exemple #3
0
    def forward_backward(self, data):
        imgs, pids = self.parse_data_for_train(data)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()

        outputs, features = self.model(imgs)

        loss = 0
        loss_summary = {}

        if self.weight_t > 0:
            loss_t = self.compute_loss(self.criterion_t, features, pids)
            loss += self.weight_t * loss_t
            loss_summary['loss_t'] = loss_t.item()

        if self.weight_x > 0:
            loss_x = self.compute_loss(self.criterion_x, outputs, pids)
            loss += self.weight_x * loss_x
            loss_summary['loss_x'] = loss_x.item()
            loss_summary['acc'] = metrics.accuracy(outputs, pids)[0].item()

        assert loss_summary

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

        return loss_summary
Exemple #4
0
    def train(self, epoch, max_epoch, trainloader, fixbase_epoch=0, open_layers=None, print_freq=10):
        losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch+1)<=fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(open_layers, epoch+1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()
            
            self.optimizer.zero_grad()
            outputs = self.model(imgs)
            loss = self._compute_loss(self.criterion, outputs, pids)
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            losses.update(loss.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx+1) % print_freq == 0:
                # estimate remaining time
                num_batches = len(trainloader)
                eta_seconds = batch_time.avg * (num_batches-(batch_idx+1) + (max_epoch-(epoch+1))*num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\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:.2f} ({acc.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'Eta {eta}'.format(
                      epoch+1, max_epoch, batch_idx+1, len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      acc=accs,
                      lr=self.optimizer.param_groups[0]['lr'],
                      eta=eta_str
                    )
                )
            
            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
    def train(self, epoch, trainloader, fixbase=False, open_layers=None, print_freq=10):
        """Trains the model for one epoch on source datasets using softmax loss.

        Args:
            epoch (int): current epoch.
            trainloader (Dataloader): training dataloader.
            fixbase (bool, optional): whether to fix base layers. Default is False.
            open_layers (str or list, optional): layers open for training.
            print_freq (int, optional): print frequency. Default is 10.
        """
        losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()

        if fixbase and (open_layers is not None):
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()
            
            self.optimizer.zero_grad()
            outputs = self.model(imgs)
            loss = self._compute_loss(self.criterion, outputs, pids)
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            losses.update(loss.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx+1) % print_freq==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'
                      'Acc {acc.val:.2f} ({acc.avg:.2f})\t'.format(
                      epoch + 1, batch_idx + 1, len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      acc=accs))
            
            end = time.time()

        if (self.scheduler is not None) and (not fixbase):
            self.scheduler.step()
Exemple #6
0
def train(epoch,
          max_epoch,
          model,
          criterion,
          optimizer,
          trainloader,
          fixbase_epoch=0,
          open_layers=None):
    losses = AverageMeter()
    accs = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()
    model.train()
    if (epoch + 1) <= fixbase_epoch and open_layers is not None:
        print('* Only train {} (epoch: {}/{})'.format(open_layers, epoch + 1,
                                                      fixbase_epoch))
        open_specified_layers(model, open_layers)
    else:
        open_all_layers(model)
    num_batches = len(trainloader)
    end = time.time()
    for batch_idx, (imgs, pids, _, _) in enumerate(trainloader):
        data_time.update(time.time() - end)
        imgs = imgs.cuda()
        pids = pids.cuda()
        optimizer.zero_grad()
        outputs = model(imgs)
        loss = criterion(outputs, pids)
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)
        losses.update(loss.item(), pids.size(0))
        accs.update(accuracy(outputs, pids)[0].item())
        if (batch_idx + 1) % 20 == 0:
            eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                            (max_epoch -
                                             (epoch + 1)) * num_batches)
            eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
            print('Epoch: [{0}/{1}][{2}/{3}]\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:.2f} ({acc.avg:.2f})\t'
                  'Lr {lr:.6f}\t'
                  'eta {eta}'.format(epoch + 1,
                                     max_epoch,
                                     batch_idx + 1,
                                     num_batches,
                                     batch_time=batch_time,
                                     data_time=data_time,
                                     loss=losses,
                                     acc=accs,
                                     lr=optimizer.param_groups[0]['lr'],
                                     eta=eta_str))
        end = time.time()
    def forward_backward(self, imgs, pids):

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()

        outputs = self.model(imgs)
        loss = self.compute_loss(self.criterion, outputs, pids)

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

        loss_summary = {
            'loss': loss.item(),
            'acc': metrics.accuracy(outputs, pids)[0].item()
        }

        return loss_summary
Exemple #8
0
def train(epoch, model, criterion, optimizer, trainloader):
    losses = AverageMeter()
    accs = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()
    model.train()
    end = time.time()
    for batch_idx, (imgs, pids) in enumerate(trainloader):
        data_time.update(time.time() - end)
        imgs = imgs.cuda()
        pids = pids.cuda()
        optimizer.zero_grad()
        outputs = model(imgs)
        loss = criterion(outputs, pids)
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)
        losses.update(loss.item(), pids.size(0))
        accs.update(accuracy(outputs, pids)[0].item())
        if (batch_idx + 1) % 20 == 0:
            num_batches = len(trainloader)
            eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                            (args.max_epoch -
                                             (epoch + 1)) * num_batches)
            eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
            print('Epoch: [{0}/{1}][{2}/{3}]\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:.2f} ({acc.avg:.2f})\t'
                  'Lr {lr:.6f}\t'
                  'Eta {eta}'.format(epoch + 1,
                                     args.max_epoch,
                                     batch_idx + 1,
                                     len(trainloader),
                                     batch_time=batch_time,
                                     data_time=data_time,
                                     loss=losses,
                                     acc=accs,
                                     lr=optimizer.param_groups[0]['lr'],
                                     eta=eta_str))
        end = time.time()
Exemple #9
0
    def forward_backward(self, data):
        imgs, pids, atts = self.parse_data_for_train(data)
        x, y, z = list(atts.size())
        atts = torch.reshape(atts, (x, y))
        atts = atts.type(torch.FloatTensor)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()
            atts = atts.cuda()

        outputs = self.model(imgs)
        loss = self.compute_loss(self.criterion, outputs[0:2], pids)
        #loss2 = self.compute_loss(self.criterion, outputs[1], pids)
        losst = nn.BCEWithLogitsLoss()
        loss2 = losst(outputs[2], atts)
        losses = [loss, loss2]
        total_loss = sum(losses)

        self.optimizer.zero_grad()
        total_loss.backward()
        self.optimizer.step()
        #print(atts)
        #print(atts.size())
        #print(outputs[1].size())
        #print(outputs[1])

        #print(type(atts))
        #print(type(outputs[1]))
        #loss2.backward()
        #self.optimizer.step()

        loss_summary = {
            'loss': loss.item(),
            'loss2': loss2.item(),
            'acc': metrics.accuracy(outputs, pids)[0].item()
        }

        return loss_summary
Exemple #10
0
    def forward_backward(self, data):
        imgs, pids = self.parse_data_for_train(data)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()

        with torch.cuda.amp.autocast():
            outputs = self.model(imgs)
            loss = self.compute_loss(self.criterion, outputs, pids)

        self.scaler.scale(loss).backward()
        self.scaler.step(self.optimizer)
        self.scaler.update()

        self.optimizer.zero_grad()

        loss_summary = {
            'loss': loss.item(),
            'acc': metrics.accuracy(outputs, pids)[0].item()
        }

        return loss_summary
    def forward_backward(self, data):
        imgs, pids = self.parse_data_for_train(data)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()

        outputs, features = self.model(imgs)
        loss_c = self.compute_loss(self.criterion_c, features, pids)
        loss_x = self.compute_loss(self.criterion_x, outputs, pids)
        loss = self.weight_c * loss_c + self.weight_x * loss_x

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

        loss_summary = {
            'loss_c': loss_c.item(),
            'loss_x': loss_x.item(),
            'acc': metrics.accuracy(outputs, pids)[0].item()
        }

        return loss_summary
Exemple #12
0
    def train(self,
              epoch,
              max_epoch,
              writer,
              print_freq=10,
              fixbase_epoch=0,
              open_layers=None):
        losses_t = AverageMeter()
        losses_x = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch + 1) <= fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(
                open_layers, epoch + 1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        num_batches = len(self.train_loader)
        end = time.time()
        for batch_idx, data in enumerate(self.train_loader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()

            self.optimizer.zero_grad()
            outputs, features = self.model(imgs)
            loss_t = self._compute_loss(self.criterion_t, features, pids)
            loss_x = self._compute_loss(self.criterion_x, outputs, pids)
            loss = self.weight_t * loss_t + self.weight_x * loss_x
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            losses_t.update(loss_t.item(), pids.size(0))
            losses_x.update(loss_x.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx + 1) % print_freq == 0:
                # estimate remaining time
                eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                                (max_epoch -
                                                 (epoch + 1)) * num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\t'
                      'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                      'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                      'Loss_t {loss_t.val:.4f} ({loss_t.avg:.4f})\t'
                      'Loss_x {loss_x.val:.4f} ({loss_x.avg:.4f})\t'
                      'Acc {acc.val:.2f} ({acc.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'eta {eta}'.format(
                          epoch + 1,
                          max_epoch,
                          batch_idx + 1,
                          num_batches,
                          batch_time=batch_time,
                          data_time=data_time,
                          loss_t=losses_t,
                          loss_x=losses_x,
                          acc=accs,
                          lr=self.optimizer.param_groups[0]['lr'],
                          eta=eta_str))

            if writer is not None:
                n_iter = epoch * num_batches + batch_idx
                writer.add_scalar('Train/Time', batch_time.avg, n_iter)
                writer.add_scalar('Train/Data', data_time.avg, n_iter)
                writer.add_scalar('Train/Loss_t', losses_t.avg, n_iter)
                writer.add_scalar('Train/Loss_x', losses_x.avg, n_iter)
                writer.add_scalar('Train/Acc', accs.avg, n_iter)
                writer.add_scalar('Train/Lr',
                                  self.optimizer.param_groups[0]['lr'], n_iter)

            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
Exemple #13
0
def train(epoch,
          model,
          criterion_xent,
          criterion_htri,
          optimizer,
          trainloader,
          use_gpu,
          writer=None):
    xent_losses = AverageMeter()
    htri_losses = AverageMeter()
    precisions = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    end = time.time()
    for batch_idx, (imgs, pids, _, adj) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids, adj = imgs.cuda(), pids.cuda(), adj.cuda()

        outputs, features = model(imgs, adj)
        if isinstance(outputs, tuple) or isinstance(outputs, list):
            xent_loss = DeepSupervision(criterion_xent, outputs, pids)
        else:
            xent_loss = criterion_xent(outputs, pids)

        if isinstance(features, tuple) or isinstance(features, list):
            htri_loss = DeepSupervision(criterion_htri, features, pids)
        else:
            htri_loss = criterion_htri(features, pids)

        loss = args.lambda_xent * xent_loss + args.lambda_htri * htri_loss
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)

        xent_losses.update(xent_loss.item(), pids.size(0))
        htri_losses.update(htri_loss.item(), pids.size(0))

        precisions.update(metrics.accuracy(outputs, pids).mean(axis=0)[0])

        if ((batch_idx + 1) % args.print_freq
                == 0) or (args.print_last
                          and batch_idx == (len(trainloader) - 1)):
            num_batches = len(trainloader)
            eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                            (args.max_epoch -
                                             (epoch + 1)) * num_batches)
            eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
            print('CurTime: {0}\t'
                  'Epoch: [{1}][{2}/{3}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Speed {speed:.3f} samples/s\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Xent {xent.val:.4f} ({xent.avg:.4f})\t'
                  'Htri {htri.val:.4f} ({htri.avg:.4f})\t'
                  'Top1 {prec.val:.4f} ({prec.avg:.4f})\t'
                  'Eta {eta}'.format(cur_time(),
                                     epoch + 1,
                                     batch_idx + 1,
                                     len(trainloader),
                                     speed=1 / batch_time.avg * imgs.shape[0],
                                     batch_time=batch_time,
                                     data_time=data_time,
                                     xent=xent_losses,
                                     htri=htri_losses,
                                     prec=precisions,
                                     eta=eta_str))

        end = time.time()
    writer.add_scalar(tag='loss/xent_loss',
                      scalar_value=xent_losses.avg,
                      global_step=epoch + 1)
    writer.add_scalar(tag='loss/htri_loss',
                      scalar_value=htri_losses.avg,
                      global_step=epoch + 1)
    def _single_model_losses(self, model, train_records, imgs, obj_ids, n_iter,
                             model_name, num_packages):
        with autocast(enabled=self.mix_precision):
            run_kwargs = self._prepare_run_kwargs(obj_ids)
            model_output = model(imgs, **run_kwargs)
            all_logits, all_embeddings, extra_data = self._parse_model_output(
                model_output)

            total_loss = torch.zeros([], dtype=imgs.dtype, device=imgs.device)
            out_logits = []
            loss_summary = dict()

            num_trg_losses = 0
            avg_acc = 0

            for trg_id in range(self.num_targets):
                trg_mask = train_records['dataset_id'] == trg_id

                trg_obj_ids = obj_ids[trg_mask]
                trg_num_samples = trg_obj_ids.numel()
                if trg_num_samples == 0:
                    out_logits.append(None)
                    continue

                trg_logits = all_logits[trg_id][trg_mask]
                main_loss = self.main_losses[trg_id](
                    trg_logits,
                    trg_obj_ids,
                    aug_index=self.aug_index,
                    lam=self.lam,
                    iteration=n_iter,
                    scale=self.scales[model_name])
                avg_acc += metrics.accuracy(trg_logits, trg_obj_ids)[0].item()
                loss_summary['main_{}/{}'.format(
                    trg_id, model_name)] = main_loss.item()

                scaled_trg_logits = self.main_losses[trg_id].get_last_scale(
                ) * trg_logits
                out_logits.append(scaled_trg_logits)

                trg_loss = main_loss
                if self.enable_metric_losses:
                    ml_loss_module = self.ml_losses[trg_id][model_name]
                    embd = all_embeddings[trg_id][trg_mask]

                    ml_loss_module.init_iteration()
                    ml_loss, ml_loss_summary = ml_loss_module(
                        embd, trg_logits, trg_obj_ids, n_iter)

                    loss_summary['ml_{}/{}'.format(
                        trg_id, model_name)] = ml_loss.item()
                    loss_summary.update(ml_loss_summary)
                    trg_loss += ml_loss

                if num_packages > 1 and self.mix_weight > 0.0:
                    mix_all_logits = scaled_trg_logits.view(
                        -1, num_packages, scaled_trg_logits.size(1))
                    mix_log_probs = torch.log_softmax(mix_all_logits, dim=2)

                    with torch.no_grad():
                        trg_mix_probs = torch.softmax(mix_all_logits,
                                                      dim=2).mean(dim=1,
                                                                  keepdim=True)

                    mixing_loss = (trg_mix_probs *
                                   mix_log_probs).sum(dim=2).neg().mean()

                    loss_summary['mix_{}/{}'.format(
                        trg_id, model_name)] = mixing_loss.item()
                    trg_loss += self.mix_weight * mixing_loss

                total_loss += trg_loss
                num_trg_losses += 1
            total_loss /= float(num_trg_losses)
            avg_acc /= float(num_trg_losses)

            if self.enable_attr and train_records['attr'] is not None:
                attributes = train_records['attr']
                all_attr_logits = extra_data['attr_logits']

                num_attr_losses = 0
                total_attr_loss = 0
                for attr_name, attr_loss_module in self.attr_losses.items():
                    attr_labels = attributes[self.attr_name_map[attr_name]]
                    valid_attr_mask = attr_labels >= 0

                    attr_labels = attr_labels[valid_attr_mask]
                    if attr_labels.numel() == 0:
                        continue

                    attr_logits = all_attr_logits[attr_name][valid_attr_mask]

                    attr_loss = attr_loss_module(attr_logits,
                                                 attr_labels,
                                                 iteration=n_iter)
                    loss_summary['{}/{}'.format(
                        attr_name, model_name)] = attr_loss.item()

                    total_attr_loss += attr_loss
                    num_attr_losses += 1

                total_loss += total_attr_loss / float(max(1, num_attr_losses))

            if self.enable_masks and train_records['mask'] is not None:
                att_loss_val = 0.0
                for att_map in extra_data['att_maps']:
                    if att_map is not None:
                        with torch.no_grad():
                            att_map_size = att_map.size()[2:]
                            pos_float_mask = F.interpolate(
                                train_records['mask'],
                                size=att_map_size,
                                mode='nearest')
                            pos_mask = pos_float_mask > 0.0
                            neg_mask = ~pos_mask

                            trg_mask_values = torch.where(
                                pos_mask, torch.ones_like(pos_float_mask),
                                torch.zeros_like(pos_float_mask))
                            num_positives = trg_mask_values.sum(dim=(1, 2, 3),
                                                                keepdim=True)
                            num_negatives = float(
                                att_map_size[0] *
                                att_map_size[1]) - num_positives

                            batch_factor = 1.0 / float(att_map.size(0))
                            pos_weights = batch_factor / num_positives.clamp_min(
                                1.0)
                            neg_weights = batch_factor / num_negatives.clamp_min(
                                1.0)

                        att_errors = torch.abs(att_map - trg_mask_values)
                        att_pos_errors = (pos_weights *
                                          att_errors)[pos_mask].sum()
                        att_neg_errors = (neg_weights *
                                          att_errors)[neg_mask].sum()

                        att_loss_val += 0.5 * (att_pos_errors + att_neg_errors)

                if att_loss_val > 0.0:
                    loss_summary['att/{}'.format(
                        model_name)] = att_loss_val.item()
                    total_loss += att_loss_val

            if self.regularizer is not None and (self.epoch +
                                                 1) > self.fixbase_epoch:
                reg_loss = self.regularizer(model)

                loss_summary['reg/{}'.format(model_name)] = reg_loss.item()
                total_loss += reg_loss

            return total_loss, loss_summary, avg_acc, out_logits
Exemple #15
0
    def train(self, epoch, max_epoch, trainloader, fixbase_epoch=0, open_layers=None, print_freq=10):
        losses1 = AverageMeter()
        losses2 = AverageMeter()
        accs1 = AverageMeter()
        accs2 = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch+1)<=fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(open_layers, epoch+1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        num_batches = len(trainloader)
        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()
            
            self.optimizer.zero_grad()
            output1, output2 = self.model(imgs)
            
            b = imgs.size(0)
            loss1 = self._compute_loss(self.criterion, output1, pids[:b//2])
            loss2 = self._compute_loss(self.criterion, output2, pids[b//2:b])
            loss = (loss1 + loss2) * 0.5
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            losses1.update(loss1.item(), pids[:b//2].size(0))
            losses2.update(loss2.item(), pids[b//2:b].size(0))
            accs1.update(metrics.accuracy(output1, pids[:b//2])[0].item())
            accs2.update(metrics.accuracy(output2, pids[b//2:b])[0].item())


            if (batch_idx+1) % print_freq == 0:
                # estimate remaining time
                eta_seconds = batch_time.avg * (num_batches-(batch_idx+1) + (max_epoch-(epoch+1))*num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\t'
                      'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                      'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                      'Loss1 {loss1.val:.4f} ({loss1.avg:.4f})\t'
                      'Loss2 {loss2.val:.4f} ({loss2.avg:.4f})\t'
                      'Acc1 {acc1.val:.2f} ({acc1.avg:.2f})\t'
                      'Acc2 {acc2.val:.2f} ({acc2.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'eta {eta}'.format(
                      epoch+1, max_epoch, batch_idx+1, num_batches,
                      batch_time=batch_time,
                      data_time=data_time,
                      loss1=losses1,
                      loss2=losses2,
                      acc1=accs1,
                      acc2=accs2,
                      lr=self.optimizer.param_groups[0]['lr'],
                      eta=eta_str
                    )
                )

            if self.writer is not None:
                n_iter = epoch * num_batches + batch_idx
                self.writer.add_scalar('Train/Time', batch_time.avg, n_iter)
                self.writer.add_scalar('Train/Data', data_time.avg, n_iter)
                self.writer.add_scalar('Train/Loss1', losses1.avg, n_iter)
                self.writer.add_scalar('Train/Loss2', losses2.avg, n_iter)
                self.writer.add_scalar('Train/Acc1', accs1.avg, n_iter)
                self.writer.add_scalar('Train/Acc2', accs2.avg, n_iter)
                self.writer.add_scalar('Train/Lr', self.optimizer.param_groups[0]['lr'], n_iter)
            
            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
Exemple #16
0
    def train(self,
              epoch,
              max_epoch,
              trainloader,
              fixbase_epoch=0,
              open_layers=None,
              print_freq=10):
        losses = AverageMeter()
        top_meters = [AverageMeter() for _ in range(5)]
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch + 1) <= fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(
                open_layers, epoch + 1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)
            num_batches = len(trainloader)
            global_step = num_batches * epoch + batch_idx

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()

            self.optimizer.zero_grad()
            outputs = self.model(imgs)
            loss = self._compute_loss(self.criterion, outputs, pids)
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            losses.update(loss.item(), pids.size(0))
            accs = metrics.accuracy(outputs, pids, topk=(1, 2, 3, 4, 5))
            for i, meter in enumerate(top_meters):
                meter.update(accs[i].item())

            # write to Tensorboard & comet.ml
            accs_dict = {
                'train-accs-top-' + str(i + 1): float(r)
                for i, r in enumerate(accs)
            }

            for i, r in enumerate(accs):
                self.writer.add_scalars('optim/train-accs',
                                        {'top-' + str(i + 1): float(r)},
                                        global_step)
            self.experiment.log_metrics(accs_dict, step=global_step)

            self.writer.add_scalar(
                'optim/loss', losses.val,
                global_step)  # loss, loss.item() or losses.val ??
            # self.writer.add_scalar('optim/loss-avg',losses.avg,global_step)
            self.experiment.log_metric('optim/loss',
                                       losses.val,
                                       step=global_step)

            self.writer.add_scalar('optim/lr',
                                   self.optimizer.param_groups[0]['lr'],
                                   global_step)
            self.experiment.log_metric('optim/lr',
                                       self.optimizer.param_groups[0]['lr'],
                                       step=global_step)

            if (batch_idx + 1) % print_freq == 0:
                # estimate remaining time
                num_batches = len(trainloader)
                eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                                (max_epoch -
                                                 (epoch + 1)) * num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\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'
                      'Top-1 {r1.val:.2f} ({r1.avg:.2f})\t'
                      'Top-2 {r2.val:.2f} ({r2.avg:.2f})\t'
                      'Top-3 {r3.val:.2f} ({r3.avg:.2f})\t'
                      'Top-4 {r4.val:.2f} ({r4.avg:.2f})\t'
                      'Top-5 {r5.val:.2f} ({r5.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'Eta {eta}'.format(
                          epoch + 1,
                          max_epoch,
                          batch_idx + 1,
                          len(trainloader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          r1=top_meters[0],
                          r2=top_meters[1],
                          r3=top_meters[2],
                          r4=top_meters[3],
                          r5=top_meters[4],
                          lr=self.optimizer.param_groups[0]['lr'],
                          eta=eta_str))
                self.writer.add_scalar('eta', eta_seconds, global_step)
                self.experiment.log_metric('eta',
                                           eta_seconds,
                                           step=global_step)

            end = time.time()

        if isinstance(self.scheduler,
                      torch.optim.lr_scheduler.ReduceLROnPlateau):
            self.scheduler.step(losses.val)
        elif self.scheduler is not None:
            self.scheduler.step()
Exemple #17
0
    def train(self,
              epoch,
              max_epoch,
              trainloader,
              fixbase_epoch=0,
              open_layers=None,
              print_freq=10):
        use_matching_loss = False
        if epoch >= self.reg_matching_score_epoch:
            use_matching_loss = True
        losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()
        att_losses = AverageMeter()
        part_losses = AverageMeter()
        matching_losses = AverageMeter()

        self.model.train()
        if (epoch + 1) <= fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(
                open_layers, epoch + 1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)
        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)

            imgs, pids, pose_heatmaps = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()
                pose_heatmaps = pose_heatmaps.cuda()

            self.optimizer.zero_grad()
            outputs, attmaps, part_score, v_g = self.model(imgs, pose_heatmaps)
            #classification loss
            loss_class = self._compute_loss(self.criterion, outputs, pids)
            # using for weighting each part with visibility
            # loss_class = self._compute_loss(self.criterion, outputs, pids, part_score.detach())
            loss_matching, loss_partconstr = self.part_c_criterion(
                v_g, pids, part_score, use_matching_loss)
            # add matching loss
            loss = loss_class + loss_partconstr
            # visibility verification loss
            if use_matching_loss:
                loss = loss + loss_matching
                matching_losses.update(loss_matching.item(), pids.size(0))
            if self.use_att_loss:
                loss_att = self.att_criterion(attmaps)
                loss = loss + loss_att
                att_losses.update(loss_att.item(), pids.size(0))
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)
            losses.update(loss.item(), pids.size(0))
            part_losses.update(loss_partconstr.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx + 1) % print_freq == 0:
                # estimate remaining time
                num_batches = len(trainloader)
                eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                                (max_epoch -
                                                 (epoch + 1)) * num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\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'
                      'part_Loss {loss_part.val:.4f} ({loss_part.avg:.4f})\t'
                      'Acc {acc.val:.2f} ({acc.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'Eta {eta}'.format(
                          epoch + 1,
                          max_epoch,
                          batch_idx + 1,
                          len(trainloader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          loss_part=part_losses,
                          acc=accs,
                          lr=self.optimizer.param_groups[0]['lr'],
                          eta=eta_str),
                      end='\t')
                if self.use_att_loss:
                    print(
                        'attLoss {attloss.val:.4f} ({attloss.avg:.4f})'.format(
                            attloss=att_losses),
                        end='\t')
                if use_matching_loss:
                    print(
                        'matchLoss {match_loss.val:.4f} ({match_loss.avg:.4f})'
                        .format(match_loss=matching_losses),
                        end='\t')
                print('\n')

            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
    def train(self, epoch, max_epoch, trainloader, fixbase_epoch=0, open_layers=None, print_freq=10):
        losses_t = AverageMeter()
        losses_x = AverageMeter()
        losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch+1)<=fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(open_layers, epoch+1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)
            num_batches = len(trainloader)
            global_step = num_batches * epoch + batch_idx

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()
            
            self.optimizer.zero_grad()
            outputs, features = self.model(imgs)
            loss_t = self._compute_loss(self.criterion_t, features, pids)
            loss_x = self._compute_loss(self.criterion_x, outputs, pids)
            loss = self.weight_t * loss_t + self.weight_x * loss_x
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            losses_t.update(loss_t.item(), pids.size(0))
            losses_x.update(loss_x.item(), pids.size(0))
            losses.update(loss.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids, topk=(1,))[0].item())

            # write to Tensorboard & comet.ml

            #self.writer.add_scalars('optim/accs',accs.val,global_step)
            self.experiment.log_metric('optim/accs',accs.val,step=global_step)

            #self.writer.add_scalar('optim/loss',losses.val,global_step) # loss, loss.item() or losses.val ??
            self.experiment.log_metric('optim/loss',losses.val,step=global_step) 
            #self.writer.add_scalar('optim/loss_triplet',losses_t.val,global_step) 
            self.experiment.log_metric('optim/loss_triplet',losses_t.val,step=global_step)
            #self.writer.add_scalar('optim/loss_softmax',losses_x.val,global_step) 
            self.experiment.log_metric('optim/loss_softmax',losses_x.val,step=global_step)

            #self.writer.add_scalar('optim/lr',self.optimizer.param_groups[0]['lr'],global_step)
            self.experiment.log_metric('optim/lr',self.optimizer.param_groups[0]['lr'],step=global_step)

            if (batch_idx+1) % print_freq == 0:
                # estimate remaining time
                num_batches = len(trainloader)
                eta_seconds = batch_time.avg * (num_batches-(batch_idx+1) + (max_epoch-(epoch+1))*num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\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'
                      'Loss_t {loss_t.val:.4f} ({loss_t.avg:.4f})\t'
                      'Loss_x {loss_x.val:.4f} ({loss_x.avg:.4f})\t'
                      'Acc {acc.val:.2f} ({acc.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'Eta {eta}'.format(
                      epoch+1, max_epoch, batch_idx+1, len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      loss_t=losses_t,
                      loss_x=losses_x,
                      acc=accs,
                      lr=self.optimizer.param_groups[0]['lr'],
                      eta=eta_str
                    )
                )
                self.writer.add_scalar('eta',eta_seconds,global_step)
                self.experiment.log_metric('eta',eta_seconds,step=global_step)
            
            end = time.time()

        if isinstance(self.scheduler, torch.optim.lr_scheduler.ReduceLROnPlateau):
            self.scheduler.step(losses.val)
        elif self.scheduler is not None:
            self.scheduler.step()
    def train(
        self,
        epoch,
        max_epoch,
        writer,
        fixbase_epoch=0,
        open_layers=None,
        print_freq=10
    ):
        losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch + 1) <= fixbase_epoch and open_layers is not None:
            print(
                '* Only train {} (epoch: {}/{})'.format(
                    open_layers, epoch + 1, fixbase_epoch
                )
            )
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        num_batches = len(self.train_loader)
        end = time.time()
        for batch_idx, data in enumerate(self.train_loader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()

            # softmax temporature
            if self.fixed_lmda or self.lmda_decay_step == -1:
                lmda = self.init_lmda
            else:
                lmda = self.init_lmda * self.lmda_decay_rate**(
                    epoch // self.lmda_decay_step
                )
                if lmda < self.min_lmda:
                    lmda = self.min_lmda

            for k in range(self.mc_iter):
                outputs = self.model(imgs, lmda=lmda)
                loss = self._compute_loss(self.criterion, outputs, pids)
                self.optimizer.zero_grad()
                loss.backward()
                self.optimizer.step()

            batch_time.update(time.time() - end)

            losses.update(loss.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx+1) % print_freq == 0:
                # estimate remaining time
                eta_seconds = batch_time.avg * (
                    num_batches - (batch_idx+1) + (max_epoch -
                                                   (epoch+1)) * num_batches
                )
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print(
                    'Epoch: [{0}/{1}][{2}/{3}]\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:.2f} ({acc.avg:.2f})\t'
                    'Lr {lr:.6f}\t'
                    'eta {eta}'.format(
                        epoch + 1,
                        max_epoch,
                        batch_idx + 1,
                        num_batches,
                        batch_time=batch_time,
                        data_time=data_time,
                        loss=losses,
                        acc=accs,
                        lr=self.optimizer.param_groups[0]['lr'],
                        eta=eta_str
                    )
                )

            if writer is not None:
                n_iter = epoch*num_batches + batch_idx
                writer.add_scalar('Train/Time', batch_time.avg, n_iter)
                writer.add_scalar('Train/Data', data_time.avg, n_iter)
                writer.add_scalar('Train/Loss', losses.avg, n_iter)
                writer.add_scalar('Train/Acc', accs.avg, n_iter)
                writer.add_scalar(
                    'Train/Lr', self.optimizer.param_groups[0]['lr'], n_iter
                )

            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
Exemple #20
0
    def train(self,
              epoch,
              max_epoch,
              trainloader,
              fixbase_epoch=0,
              open_layers=None,
              print_freq=10):
        losses = AverageMeter()
        base_losses = AverageMeter()
        my_losses = AverageMeter()
        density_losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch + 1) <= fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(
                open_layers, epoch + 1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        num_batches = len(trainloader)
        end = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()

            output = self.model(imgs)
            output, v = output

            # attention_loss = 0
            # for i in range(iy.shape[1]):
            #     attention_loss_i = self._compute_loss(self.criterion, iy[:, i, :], pids)
            #     attention_loss += attention_loss_i
            #     if (batch_idx + 1) % print_freq == 0:
            #         print("test: ", i, attention_loss_i)
            #self.optimizer.zero_grad()
            #attention_loss.backward(retain_graph=True)
            #self.optimizer.step()

            #self.optimizer.zero_grad()
            #print(output.shape)
            #my = my.squeeze()
            #print(my.shape)
            #Plabels = torch.range(0, my.shape[1] - 1).long().cuda().repeat(imgs.shape[0], 1, 1, 1).reshape(-1)
            #Plabels = torch.range(0, my.shape[1] - 1).long().cuda().repeat(my.shape[0], 1, 1, 1).view(-1, my.shape[1])

            #print(Plabels.shape, Plabels)
            #my_loss = torch.nn.CrossEntropyLoss()(my, Plabels)
            base_loss = self._compute_loss(self.criterion, output, pids)
            loss = base_loss  # + 0.1 * my_loss #- density

            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)
            losses.update(loss.item(), pids.size(0))
            base_losses.update(base_loss.item(), pids.size(0))
            #my_losses.update(my_loss.item(), pids.size(0))
            #density_losses.update(density.item(), pids.size(0))

            accs.update(metrics.accuracy(output, pids)[0].item())

            if (batch_idx + 1) % print_freq == 0:
                # estimate remaining time
                eta_seconds = batch_time.avg * (num_batches - (batch_idx + 1) +
                                                (max_epoch -
                                                 (epoch + 1)) * num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\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:.2f} ({acc.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'eta {eta}'.format(
                          epoch + 1,
                          max_epoch,
                          batch_idx + 1,
                          num_batches,
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          acc=accs,
                          lr=self.optimizer.param_groups[0]['lr'],
                          eta=eta_str))

            if self.writer is not None:
                n_iter = epoch * num_batches + batch_idx
                self.writer.add_scalar('Train/Time', batch_time.avg, n_iter)
                self.writer.add_scalar('Train/Data', data_time.avg, n_iter)
                self.writer.add_scalar('Train/Loss', losses.avg, n_iter)
                self.writer.add_scalar('Train/Base_Loss', base_losses.avg,
                                       n_iter)
                #self.writer.add_scalar('Train/My_Loss', my_losses.avg, n_iter)
                self.writer.add_scalar('Train/Density_loss',
                                       density_losses.avg, n_iter)
                self.writer.add_scalar('Train/Acc', accs.avg, n_iter)
                self.writer.add_scalar('Train/Lr',
                                       self.optimizer.param_groups[0]['lr'],
                                       n_iter)

            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
    def train(
            self,
            epoch,
            max_epoch,
            writer,
            print_freq=10,
            fixbase_epoch=0,
            open_layers=None
    ):
        losses_t = AverageMeter()
        losses_x = AverageMeter()
        losses_recons = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
       
        open_all_layers(self.model)

        num_batches = len(self.train_loader)
        end = time.time()
        for batch_idx, data in enumerate(self.train_loader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            imgs_clean=imgs.clone()
            if self.use_gpu:
                imgs = imgs.cuda()
                imgs_clean = imgs_clean.cuda()
                pids = pids.cuda()
            labelss=[]
            if epoch >= 0 and epoch < 15:
                randmt = RandomErasing(probability=0.5,sl=0.07, sh=0.3)
                for i, img in enumerate(imgs):
                   
                   imgs[i],p = randmt(img)
                   labelss.append(p)
               
            if epoch >= 15:
                randmt = RandomErasing(probability=0.5,sl=0.1, sh=0.3)
                for i, img in enumerate(imgs):
                   
                   imgs[i],p = randmt(img)
                   labelss.append(p)

            binary_labels = torch.tensor(np.asarray(labelss)).cuda()
            self.optimizer.zero_grad()
            
            outputs, outputs2, recons,bin_out1,bin_out2, bin_out3 = self.model(imgs )
            loss_mse = self.criterion_mse(recons, imgs_clean)
            loss = self.mgn_loss(outputs, pids)
            
            occ_loss1 = self.BCE_criterion(bin_out1.squeeze(1),binary_labels.float() )
            occ_loss2 = self.BCE_criterion(bin_out2.squeeze(1),binary_labels.float() )
            occ_loss3 = self.BCE_criterion(bin_out3.squeeze(1),binary_labels.float() )


            loss = loss + .05*loss_mse + 0.1*occ_loss1 + 0.1*occ_loss2+0.1*occ_loss3
            #loss = self.weight_t * loss_t + self.weight_x * loss_x #+ #self.weight_r*loss_mse
            loss.backward()
            self.optimizer.step()

            batch_time.update(time.time() - end)

            #losses_t.update(loss_t.item(), pids.size(0))
            losses_x.update(loss.item(), pids.size(0))
            losses_recons.update(occ_loss1.item(), binary_labels.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx + 1) % print_freq == 0:
                # estimate remaining time
                eta_seconds = batch_time.avg * (
                        num_batches - (batch_idx + 1) + (max_epoch -
                                                         (epoch + 1)) * num_batches
                )
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print(
                    'Epoch: [{0}/{1}][{2}/{3}]\t'
                    'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                    'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                    #'Loss_t {loss_t.val:.4f} ({loss_t.avg:.4f})\t'
                    'Loss_x {loss_x.val:.4f} ({loss_x.avg:.4f})\t'
                    'Loss_Occlusion {loss_r.val:.4f} ({loss_r.avg:.4f})\t'             
                    'Acc {acc.val:.2f} ({acc.avg:.2f})\t'
                    'Lr {lr:.6f}\t'
                    'eta {eta}'.format(
                        epoch + 1,
                        max_epoch,
                        batch_idx + 1,
                        num_batches,
                        batch_time=batch_time,
                        data_time=data_time,
                        #loss_t=losses_t,
                        loss_x=losses_x,
                        loss_r = losses_recons,
                        acc=accs,
                        lr=self.optimizer.param_groups[0]['lr'],
                        eta=eta_str
                    )
                )
            writer= None
            if writer is not None:
                n_iter = epoch * num_batches + batch_idx
                writer.add_scalar('Train/Time', batch_time.avg, n_iter)
                writer.add_scalar('Train/Data', data_time.avg, n_iter)
                writer.add_scalar('Train/Loss_t', losses_t.avg, n_iter)
                writer.add_scalar('Train/Loss_x', losses_x.avg, n_iter)
                writer.add_scalar('Train/Acc', accs.avg, n_iter)
                writer.add_scalar(
                    'Train/Lr', self.optimizer.param_groups[0]['lr'], n_iter
                )

            end = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
Exemple #22
0
    def train(self, epoch, max_epoch, trainloader, fixbase_epoch=0, open_layers=None, print_freq=10):
        losses = AverageMeter()
        reg_ow_loss = AverageMeter()
        metric_loss = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()

        self.model.train()
        if (epoch + 1) <= fixbase_epoch and open_layers is not None:
            print('* Only train {} (epoch: {}/{})'.format(open_layers, epoch+1, fixbase_epoch))
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        num_batches = len(trainloader)
        start_time = time.time()
        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - start_time)

            imgs, pids = self._parse_data_for_train(data)
            imgs, pids = self._apply_batch_transform(imgs, pids)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()

            self.optimizer.zero_grad()
            if self.metric_loss is not None:
                embeddings, outputs = self.model(imgs, get_embeddings=True)
            else:
                outputs = self.model(imgs)

            loss = self._compute_loss(self.criterion, outputs, pids)

            if (epoch + 1) > fixbase_epoch:
                reg_loss = self.regularizer(self.model)
                reg_ow_loss.update(reg_loss.item(), pids.size(0))
                loss += reg_loss

            if self.metric_loss is not None:
                metric_val = self.metric_loss(F.normalize(embeddings, dim=1),
                                              outputs, pids)
                loss += metric_val
                metric_loss.update(metric_val.item(), pids.size(0))

            loss.backward()
            self.optimizer.step()

            losses.update(loss.item(), pids.size(0))
            accs.update(metrics.accuracy(outputs, pids)[0].item())
            batch_time.update(time.time() - start_time)

            if print_freq > 0 and (batch_idx + 1) % print_freq == 0:
                eta_seconds = batch_time.avg * (num_batches-(batch_idx + 1) + (max_epoch - (epoch + 1)) * num_batches)
                eta_str = str(datetime.timedelta(seconds=int(eta_seconds)))
                print('Epoch: [{0}/{1}][{2}/{3}]\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'
                      'AUX Losses {aux_losses.val:.4f} ({aux_losses.avg:.4f})\t'
                      'Acc {acc.val:.2f} ({acc.avg:.2f})\t'
                      'Lr {lr:.6f}\t'
                      'eta {eta}'.
                      format(
                          epoch + 1, max_epoch, batch_idx + 1, num_batches,
                          batch_time=batch_time,
                          data_time=data_time,
                          aux_losses=metric_loss,
                          loss=losses,
                          acc=accs,
                          lr=self.optimizer.param_groups[0]['lr'],
                          eta=eta_str,
                      )
                )

                if self.writer is not None:
                    n_iter = epoch * num_batches + batch_idx
                    self.writer.add_scalar('Train/Time', batch_time.avg, n_iter)
                    self.writer.add_scalar('Train/Data', data_time.avg, n_iter)
                    info = self.criterion.get_last_info()
                    for k in info:
                        self.writer.add_scalar('AUX info/' + k, info[k], n_iter)
                    self.writer.add_scalar('Loss/train', losses.avg, n_iter)
                    if (epoch + 1) > fixbase_epoch:
                        self.writer.add_scalar('Loss/reg_ow', reg_ow_loss.avg, n_iter)
                    self.writer.add_scalar('Accuracy/train', accs.avg, n_iter)
                    self.writer.add_scalar('Learning rate', self.optimizer.param_groups[0]['lr'], n_iter)
                    if self.metric_loss is not None:
                        self.writer.add_scalar('Loss/local_push_loss',
                                               metric_val.item(), n_iter)
            start_time = time.time()

        if self.scheduler is not None:
            self.scheduler.step()
Exemple #23
0
    def forward_backward(self, data):
        imgs, swapped_imgs, pids, original_label, swapped_label, original_law, swapped_law = self.parse_data_for_train(
            data)
        # imgs, pids = self.parse_data_for_train(data)

        if self.use_gpu:
            imgs = imgs.cuda()
            pids = pids.cuda()
            swapped_imgs = swapped_imgs.cuda()
            original_label = original_label.cuda()
            swapped_label = swapped_label.cuda()
            original_law = original_law.cuda()
            swapped_law = swapped_law.cuda()
        self.optimizer.zero_grad()
        outputs = self.model(imgs)
        loss_x = self.compute_loss(self.criterion_x, outputs[0], pids)
        loss_t = self.compute_loss(self.criterion_trip, outputs[1], pids)
        # print(original_law.size())
        loss_r = self.compute_loss(self.criterion_rec, outputs[2],
                                   original_law)  # reconstruction

        loss_a = self.compute_loss(self.criterion_adver, outputs[3],
                                   original_label)  # adversarial
        loss = 1 * loss_x + 1 * loss_t + 0.01 * loss_r + 0.01 * loss_a
        # loss = self.weight_x * loss_x + self.weight_t * loss_t + self.weight_r * loss_r + self.weight_a * loss_a

        loss.backward()
        self.optimizer.step()

        loss_summary = {
            'loss_x':
            loss_x.item(),
            'loss_t':
            loss_t.item(),
            'loss_r':
            loss_r.item(),
            'loss_a':
            loss_a.item(),
            'cat_acc':
            metrics.accuracy(outputs[0], pids)[0].item(),
            'd_acc':
            (metrics.accuracy(outputs[3], original_label)[0].item() +
             metrics.accuracy(outputs[3], swapped_label)[0].item()) / 2
        }
        print(
            'loss_x {loss_x:.4f} loss_t {loss_t:.4f} loss_r {loss_r:.4f} loss_a {loss_a:.4f}'
            ' cat_acc {cat_acc:.3f}'
            ' d_acc {d_acc:.4f} '.format(loss_x=loss_x.item(),
                                         loss_t=loss_t.item(),
                                         loss_r=loss_r.item(),
                                         loss_a=loss_a.item(),
                                         cat_acc=loss_summary['cat_acc'],
                                         d_acc=loss_summary['d_acc']))
        # print(loss_summary)

        self.optimizer.zero_grad()
        outputs = self.model(swapped_imgs)
        loss_x = self.compute_loss(self.criterion_x, outputs[0], pids)
        loss_t = self.compute_loss(self.criterion_trip, outputs[1], pids)
        loss_r = self.compute_loss(self.criterion_rec, outputs[2],
                                   swapped_law)  # reconstruction
        loss_a = self.compute_loss(self.criterion_adver, outputs[3],
                                   swapped_label)  # adversarial

        loss = 1 * loss_x + 1 * loss_t + 0.01 * loss_r + 0.01 * loss_a

        loss_summary = {
            'loss_x':
            loss_x.item(),
            'loss_t':
            loss_t.item(),
            'loss_r':
            loss_r.item(),
            'loss_a':
            loss_a.item(),
            'cat_acc':
            metrics.accuracy(outputs[0], pids)[0].item(),
            'd_acc':
            (metrics.accuracy(outputs[3], original_label)[0].item() +
             metrics.accuracy(outputs[3], swapped_label)[0].item()) / 2
        }
        print(
            'loss_x {loss_x:.4f} loss_t {loss_t:.4f} loss_r {loss_r:.4f} loss_a {loss_a:.4f}'
            ' cat_acc {cat_acc:.3f}'
            ' d_acc {d_acc:.4f} '.format(loss_x=loss_x.item(),
                                         loss_t=loss_t.item(),
                                         loss_r=loss_r.item(),
                                         loss_a=loss_a.item(),
                                         cat_acc=loss_summary['cat_acc'],
                                         d_acc=loss_summary['d_acc']))

        loss.backward()
        self.optimizer.step()

        return loss_summary
    def train(self,
              epoch,
              trainloader,
              fixbase=False,
              open_layers=None,
              print_freq=10):
        """Trains the model for one epoch on source datasets using softmax loss.

		Args:
			epoch (int): current epoch.
			trainloader (Dataloader): training dataloader.
			fixbase (bool, optional): whether to fix base layers. Default is False.
			open_layers (str or list, optional): layers open for training.
			print_freq (int, optional): print frequency. Default is 10.
		"""
        losses = AverageMeter()
        accs = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()
        p_nums = AverageMeter()
        n_nums = AverageMeter()

        self.model.train()

        if fixbase and (open_layers is not None):
            open_specified_layers(self.model, open_layers)
        else:
            open_all_layers(self.model)

        end = time.time()

        # print('QQ')
        # for batch_idx, data in enumerate(trainloader):
        #     imgs, pids = self._parse_data_for_train(data)
        #     print(pids)
        # print('QQ')
        # tensor([691, 691, 691, 691,  68,  68,  68,  68, 468, 468, 468, 468,  67,  67,
        #          67,  67, 232, 232, 232, 232, 293, 293, 293, 293, 244, 244, 244, 244,
        #          13,  13,  13,  13])
        # tensor([290, 290, 290, 290, 535, 535, 535, 535,  55,  55,  55,  55, 558, 558,
        #         558, 558, 129, 129, 129, 129, 699, 699, 699, 699, 232, 232, 232, 232,
        #         655, 655, 655, 655])
        # ...

        for batch_idx, data in enumerate(trainloader):
            data_time.update(time.time() - end)

            imgs, pids = self._parse_data_for_train(data)
            if self.use_gpu:
                imgs = imgs.cuda()
                pids = pids.cuda()

            self.optimizer.zero_grad()
            outputs = self.model(imgs)
            loss, p_num, n_num = self._compute_loss(self.criterion, outputs,
                                                    pids)
            # loss = Variable(loss, requires_grad = True)
            if loss.item() > 0:
                loss.backward()
                self.optimizer.step()

            batch_time.update(time.time() - end)

            losses.update(loss.item(), pids.size(0))
            p_nums.update(p_num)
            n_nums.update(n_num)
            accs.update(metrics.accuracy(outputs, pids)[0].item())

            if (batch_idx + 1) % print_freq == 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'
                      'MS Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                      'P-num {p.val:.2f} ({p.avg:.2f})\t'
                      'N-num {n.val:.2f} ({n.avg:.2f})\t'
                      'Acc {acc.val:.2f} ({acc.avg:.2f})\t'.format(
                          epoch + 1,
                          batch_idx + 1,
                          len(trainloader),
                          batch_time=batch_time,
                          data_time=data_time,
                          loss=losses,
                          p=p_nums,
                          n=n_nums,
                          acc=accs))

            end = time.time()

        if (self.scheduler is not None) and (not fixbase):
            self.scheduler.step()
    def forward_backward(self, data):
        n_iter = self.epoch * self.num_batches + self.batch_idx
        self.optimizer.zero_grad()

        train_records = self.parse_data_for_train(data, True, self.enable_masks, self.use_gpu)
        imgs = train_records['img']
        obj_ids = train_records['obj_id']
        imgs, obj_ids = self._apply_batch_transform(imgs, obj_ids)

        run_kwargs = self._prepare_run_kwargs()
        model_output = self.model(imgs, **run_kwargs)
        all_logits, all_embeddings, extra_data = self._parse_model_output(model_output)

        total_loss = torch.zeros([], dtype=imgs.dtype, device=imgs.device)
        loss_summary = dict()

        num_trg_losses = 0
        avg_acc = 0
        for trg_id in range(self.num_targets):
            trg_mask = train_records['dataset_id'] == trg_id

            trg_obj_ids = obj_ids[trg_mask]
            trg_num_samples = trg_obj_ids.numel()
            if trg_num_samples == 0:
                continue

            trg_logits = all_logits[trg_id][trg_mask]
            main_loss = self.main_losses[trg_id](trg_logits, trg_obj_ids, iteration=n_iter)
            avg_acc += metrics.accuracy(trg_logits, trg_obj_ids)[0].item()
            loss_summary['main_{}'.format(trg_id)] = main_loss.item()

            trg_loss = main_loss
            if self.enable_metric_losses:
                ml_loss_module = self.ml_losses[trg_id]
                embd = all_embeddings[trg_id][trg_mask]

                ml_loss_module.init_iteration()
                ml_loss, ml_loss_summary = ml_loss_module(embd, trg_logits, trg_obj_ids, n_iter)
                ml_loss_module.end_iteration()

                loss_summary['ml_{}'.format(trg_id)] = ml_loss.item()
                loss_summary.update(ml_loss_summary)
                trg_loss += ml_loss

            total_loss += trg_loss
            num_trg_losses += 1
        total_loss /= float(num_trg_losses)
        avg_acc /= float(num_trg_losses)

        if self.enable_attr and train_records['attr'] is not None:
            attributes = train_records['attr']
            all_attr_logits = extra_data['attr_logits']

            num_attr_losses = 0
            total_attr_loss = 0
            for attr_name, attr_loss_module in self.attr_losses.items():
                attr_labels = attributes[self.attr_name_map[attr_name]]
                valid_attr_mask = attr_labels >= 0

                attr_labels = attr_labels[valid_attr_mask]
                if attr_labels.numel() == 0:
                    continue

                attr_logits = all_attr_logits[attr_name][valid_attr_mask]

                attr_loss = attr_loss_module(attr_logits, attr_labels, iteration=n_iter)
                loss_summary[attr_name] = attr_loss.item()

                total_attr_loss += attr_loss
                num_attr_losses += 1

            total_loss += total_attr_loss / float(max(1, num_attr_losses))

        if self.enable_masks and train_records['mask'] is not None:
            att_loss_val = 0.0
            for att_map in extra_data['att_maps']:
                if att_map is not None:
                    with torch.no_grad():
                        att_map_size = att_map.size()[2:]
                        pos_float_mask = F.interpolate(train_records['mask'], size=att_map_size, mode='nearest')
                        pos_mask = pos_float_mask > 0.0
                        neg_mask = ~pos_mask

                        trg_mask_values = torch.where(pos_mask,
                                                      torch.ones_like(pos_float_mask),
                                                      torch.zeros_like(pos_float_mask))
                        num_positives = trg_mask_values.sum(dim=(1, 2, 3), keepdim=True)
                        num_negatives = float(att_map_size[0] * att_map_size[1]) - num_positives

                        batch_factor = 1.0 / float(att_map.size(0))
                        pos_weights = batch_factor / num_positives.clamp_min(1.0)
                        neg_weights = batch_factor / num_negatives.clamp_min(1.0)

                    att_errors = torch.abs(att_map - trg_mask_values)
                    att_pos_errors = (pos_weights * att_errors)[pos_mask].sum()
                    att_neg_errors = (neg_weights * att_errors)[neg_mask].sum()

                    att_loss_val += 0.5 * (att_pos_errors + att_neg_errors)

            if att_loss_val > 0.0:
                loss_summary['att'] = att_loss_val.item()
                total_loss += att_loss_val

        if self.regularizer is not None and (self.epoch + 1) > self.fixbase_epoch:
            reg_loss = self.regularizer(self.model)

            loss_summary['reg'] = reg_loss.item()
            total_loss += reg_loss

        loss_summary['loss'] = total_loss.item()

        total_loss.backward()
        self.optimizer.step()

        return loss_summary, avg_acc