def preeval_batch(self, test_loader, abs_len, num_exams):
     torch.set_grad_enabled(False)
     refs = {}
     cands = []
     for i in range(num_exams):
         cands.append({})
     i = 0
     for batch_idx, (source, target, input_lengths) in enumerate(test_loader):
         for j in range(source.size(0)):
             i += 1
             ref = self.prepare_for_bleu(target[j])
             refs[i] = [ref]
         input_variables = source
         input_lengths = input_lengths.tolist()
         prev_generated_seq = None
         for k in range(num_exams):
             _, _, other = \
                 self.model(input_variables, prev_generated_seq, input_lengths)
             length = other['length']
             sequence = torch.stack(other['sequence'], 1).squeeze(2)
             prev_generated_seq = self._mask(sequence)
             for j in range(len(length)):
                 out_seq = [other['sequence'][di][j] for di in range(length[j])]
                 out = self.prepare_for_bleu(out_seq)
                 cands[k][i] = out
         if i % 100 == 0:
             print("Percentages:  %.4f" % (i/float(abs_len)))
     return cands, refs
예제 #2
0
파일: vgsl.py 프로젝트: mittagessen/kraken
 def eval(self) -> None:
     """
     Sets the model to evaluation/inference mode, disabling dropout and
     gradient calculation.
     """
     self.nn.eval()
     torch.set_grad_enabled(False)
예제 #3
0
def occlusion_sensitivity(
    model, images, ids, mean=None, patch=35, stride=1, n_batches=128
):
    """
    "Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization"
    https://arxiv.org/pdf/1610.02391.pdf
    Look at Figure A5 on page 17
    
    Originally proposed in:
    "Visualizing and Understanding Convolutional Networks"
    https://arxiv.org/abs/1311.2901
    """

    torch.set_grad_enabled(False)
    model.eval()
    mean = mean if mean else 0
    patch_H, patch_W = patch if isinstance(patch, Sequence) else (patch, patch)
    pad_H, pad_W = patch_H // 2, patch_W // 2

    # Padded image
    images = F.pad(images, (pad_W, pad_W, pad_H, pad_H), value=mean)
    B, _, H, W = images.shape
    new_H = (H - patch_H) // stride + 1
    new_W = (W - patch_W) // stride + 1

    # Prepare sampling grids
    anchors = []
    grid_h = 0
    while grid_h <= H - patch_H:
        grid_w = 0
        while grid_w <= W - patch_W:
            grid_w += stride
            anchors.append((grid_h, grid_w))
        grid_h += stride

    # Baseline score without occlusion
    baseline = model(images).detach().gather(1, ids)

    # Compute per-pixel logits
    scoremaps = []
    for i in tqdm(range(0, len(anchors), n_batches), leave=False):
        batch_images = []
        batch_ids = []
        for grid_h, grid_w in anchors[i : i + n_batches]:
            images_ = images.clone()
            images_[..., grid_h : grid_h + patch_H, grid_w : grid_w + patch_W] = mean
            batch_images.append(images_)
            batch_ids.append(ids)
        batch_images = torch.cat(batch_images, dim=0)
        batch_ids = torch.cat(batch_ids, dim=0)
        scores = model(batch_images).detach().gather(1, batch_ids)
        scoremaps += list(torch.split(scores, B))

    diffmaps = torch.cat(scoremaps, dim=1) - baseline
    diffmaps = diffmaps.view(B, new_H, new_W)

    return diffmaps
예제 #4
0
파일: vgsl.py 프로젝트: mittagessen/kraken
 def train(self) -> None:
     """
     Sets the model to training mode (enables dropout layers and disables
     softmax on CTC layers).
     """
     self.nn.train()
     # set last layer back to eval mode if not CTC output layer
     # (log_softmax/softmax switch).
     if not self.criterion:
         self.nn[-1].eval()
     torch.set_grad_enabled(True)
예제 #5
0
 def _worker(i, module, input, kwargs, device=None):
     torch.set_grad_enabled(grad_enabled)
     if device is None:
         device = get_a_var(input).get_device()
     try:
         with torch.cuda.device(device):
             output = module(*input, **kwargs)
         with lock:
             results[i] = output
     except Exception as e:
         with lock:
             results[i] = e
    def predict_seq_title(self, title, sec_seq, num_exams):
        """ Make prediction given `src_seq` as input.

        Args:
            src_seq (list): list of tokens in source language

        Returns:
            tgt_seq (list): list of tokens in target language as predicted
            by the pre-trained model
        """
        torch.set_grad_enabled(False)
        text = []
        for tok in title:
            if tok in self.vectorizer.word2idx:
                text.append(self.vectorizer.word2idx[tok])
            else:
                text.append(3)

        input_variable = torch.LongTensor(text).view(1, -1)
        if torch.cuda.is_available():
            input_variable = input_variable.cuda()

        input_lengths = [len(title)]

        text = []
        for tok in sec_seq:
            if tok in self.vectorizer.word2idx:
                text.append(self.vectorizer.word2idx[tok])
            else:
                text.append(3)

        prev_generated_seq = torch.LongTensor(text).view(1, -1)
        if torch.cuda.is_available():
            prev_generated_seq = prev_generated_seq.cuda()

        outputs = []
        for i in range(num_exams):
            _, _, other = \
                self.model(input_variable, prev_generated_seq, input_lengths)
            length = other['length'][0]

            tgt_id_seq = [other['sequence'][di][0].item() for di in range(length)]
            tgt_seq = [self.vectorizer.idx2word[tok] for tok in tgt_id_seq]
            output = ' '.join([i for i in tgt_seq if i != '<PAD>' and i != '<EOS>' and i != '<SOS>'])
            outputs.append(output)
            prev_generated_seq = torch.LongTensor(tgt_id_seq).view(1, -1)
            if torch.cuda.is_available():
                prev_generated_seq = prev_generated_seq.cuda()
        return outputs
예제 #7
0
 def _worker(i, module, input, kwargs, device=None):
     torch.set_grad_enabled(grad_enabled)
     if device is None:
         device = get_a_var(input).get_device()
     try:
         with torch.cuda.device(device):
             # this also avoids accidental slicing of `input` if it is a Tensor
             if not isinstance(input, (list, tuple)):
                 input = (input,)
             output = module(*input, **kwargs)
         with lock:
             results[i] = output
     except Exception as e:
         with lock:
             results[i] = e
    def _make_images_board(self, model):
        model.eval()
        num_imgs = 64
        fuseTrans = self.cfg.fuseTrans

        batch = next(iter(self.data_loaders[1]))
        input_images, renderTrans, depthGT, maskGT = utils.unpack_batch_novel(batch, self.cfg.device)

        with torch.set_grad_enabled(False):
            XYZ, maskLogit = model(input_images)
            # ------ build transformer ------
            XYZid, ML = transform.fuse3D(
                self.cfg, XYZ, maskLogit, fuseTrans) # [B,3,VHW],[B,1,VHW]
            newDepth, newMaskLogit, collision = transform.render2D(
                self.cfg, XYZid, ML, renderTrans)  # [B,N,1,H,W]

        return {'RGB': utils.make_grid( input_images[:num_imgs]),
                'depth': utils.make_grid(
                    ((1-newDepth)*(collision==1).float())[:num_imgs, 0, 0:1, :, :]),
                'depthGT': utils.make_grid(
                    1-depthGT[:num_imgs, 0, 0:1, :, :]),
                'mask': utils.make_grid(
                    torch.sigmoid(maskLogit[:num_imgs, 0:1,:, :])),
                'mask_rendered': utils.make_grid(
                    torch.sigmoid(newMaskLogit[:num_imgs, 0, 0:1, :, :])),
                'maskGT': utils.make_grid(
                    maskGT[:num_imgs, 0, 0:1, :, :]),
                }
    def eval_dist(self):
        print("======= EVALUATION START =======")
        CADN = len(self.CADs)

        pred2GT_all = np.ones([CADN, self.cfg.inputViewN]) * np.inf
        GT2pred_all = np.ones([CADN, self.cfg.inputViewN]) * np.inf
        with torch.set_grad_enabled(False):
            for m, cad in enumerate(self.CADs):
                # load GT
                obj = scipy.io.loadmat(f"{self.cfg.path}/{self.cfg.category}_testGT/{cad}.mat")
                Vgt = torch.from_numpy(np.concatenate([obj["V"], obj["Vd"]], axis=0)).to(self.device).float()
                VgtN = len(Vgt)
                # load prediction
                Vpred24 = scipy.io.loadmat(f"{self.result_path}/{cad}.mat")["pointcloud"][:, 0]
                assert (len(Vpred24) == self.cfg.inputViewN)

                for a in range(self.cfg.inputViewN):
                    Vpred = torch.from_numpy(Vpred24[a]).to(self.device).float()
                    VpredN = len(Vpred)
                    # rotate CAD model to be in consistent coordinates
                    Vpred[:, 1], Vpred[:, 2] = Vpred[:, 2], -Vpred[:, 1]
                    # compute test error in both directions
                    pred2GT_all[m, a] = self._computeTestError(Vpred, Vgt, type="pred->GT")
                    GT2pred_all[m, a] = self._computeTestError(Vgt, Vpred, type="GT->pred")

                info = {"cad": cad,
                        "pred->GT": pred2GT_all[m].mean()*100,
                        "GT->pred": GT2pred_all[m].mean()*100,}
                print(info)
                self.history.append(info)

        print("======= EVALUATION DONE =======")
        return pd.DataFrame(self.history)
예제 #10
0
    def _get_state_action_values(self, transitions):
        batch_size = len(transitions)
        batch = Transition(*zip(*transitions))

        non_final_mask = torch.tensor(tuple(map(lambda s: s is not None, batch.next_state)), dtype=torch.uint8, device=self.config.device)

        state_batch = torch.cat(batch.state).to(torch.float32)
        action_batch = torch.cat(batch.action)
        reward_batch = torch.cat(batch.reward).to(torch.float32)
        
        next_state_values = torch.zeros(batch_size).to(self.config.device, dtype=torch.float32)

        next_states = [s for s in batch.next_state if s is not None]
        if len(next_states) != 0:
            with torch.no_grad():
                non_final_next_state = torch.cat(next_states).to(torch.float32)

                Q = self._get_Q(self.model, non_final_next_state)
                best_actions = torch.argmax(Q, dim=1, keepdim=True)

                Q_target = self._get_Q(self.target_model, non_final_next_state)
                next_state_values[non_final_mask] = Q_target.gather(1, best_actions).squeeze()

        gamma = self.config.gamma ** self.config.num_multi_step_reward
        expected_values = reward_batch + gamma * next_state_values

        with torch.set_grad_enabled(self.model.training):
            Q = self._get_Q(self.model, state_batch)
            values = torch.squeeze(Q.gather(1, action_batch))
            values.to(self.config.device, dtype=torch.float32)

        return (values, expected_values)
예제 #11
0
def train_batch(param):
    if len(memory) < param['batch_size']:
        return 0
    batch = memory.sample(param['batch_size'])
    batch_states = default_states_preprocessor([m.state for m in batch])
    batch_next_states = default_states_preprocessor([m.next_state for m in batch])
    batch_ended = torch.tensor([m.ended for m in batch])
    batch_rewards = torch.tensor([m.reward for m in batch]).to(device)
    batch_actions = torch.tensor([m.action for m in batch]).to(device)

    ## Calculate expected reward:
    with torch.set_grad_enabled(False):
        not_ended_batch = 1 -torch.ByteTensor(batch_ended).to(device)
        next_states_non_final = batch_next_states[not_ended_batch]
        next_state_values = torch.zeros(param['batch_size']).to(device)
        reward_hat = target_dqn(next_states_non_final)
        next_state_values[not_ended_batch] = reward_hat.max(1)[0]
        expected_state_action_values = next_state_values*param['GAMMA'] + batch_rewards

    # Predict value function:
    yhat = dqn(batch_states)
    state_action_values = yhat.gather(1, batch_actions.unsqueeze(1)).squeeze()

    loss = F.smooth_l1_loss(state_action_values, expected_state_action_values)
    optimizer.zero_grad()
    loss.backward()
    for param in dqn.parameters():
        param.data.clamp_(-1, 1)
    optimizer.step()
    return float(loss.data.cpu().numpy())
예제 #12
0
파일: test.py 프로젝트: gtesei/fast-furious
def test():
    test_transform = Compose([PrepareImageAndMask(),
                              ResizeToNxN(img_size) if args.resize else PadToNxN(img_size), HWCtoCHW()])
    test_dataset = SaltIdentification(mode='test', transform=test_transform, preload=False)
    test_dataloader = DataLoader(test_dataset, batch_size=args.batch_size, num_workers=args.dataload_workers_nums)

    flipped_test_transform = Compose([PrepareImageAndMask(), HorizontalFlip(),
                                      ResizeToNxN(img_size) if args.resize else PadToNxN(img_size), HWCtoCHW()])
    flipped_test_dataset = SaltIdentification(mode='test', transform=flipped_test_transform, preload=False)
    flipped_test_dataloader_iter = iter(DataLoader(flipped_test_dataset, batch_size=args.batch_size,
                                                   num_workers=args.dataload_workers_nums))

    model.eval()
    torch.set_grad_enabled(False)

    prediction = {}
    submission = {}
    pbar = tqdm(test_dataloader, unit="images", unit_scale=test_dataloader.batch_size, disable=None)

    empty_images_count = 0
    for batch in pbar:
        if args.tta:
            flipped_batch = next(flipped_test_dataloader_iter)
        else:
            flipped_batch = None

        probs = predict(model, batch, flipped_batch, use_gpu=use_gpu)
        pred = probs > args.threshold
        empty_images_count += (pred.sum(axis=(1, 2)) == 0).sum()

        probs_uint16 = (65535 * probs).astype(dtype=np.uint16)

        image_ids = batch['image_id']
        prediction.update(dict(zip(image_ids, probs_uint16)))
        rle = rlenc_np(pred)
        submission.update(dict(zip(image_ids, rle)))

    empty_images_percentage = empty_images_count / len(prediction)
    print("empty images: %.2f%% (in public LB 38%%)" % (100 * empty_images_percentage))

    gzip_save('-'.join([args.output_prefix, 'probabilities.pkl.gz']), prediction)
    sub = pd.DataFrame.from_dict(submission, orient='index')
    sub.index.names = ['id']
    sub.columns = ['rle_mask']
    sub.to_csv('-'.join([args.output_prefix, 'submission.csv']))
    def _train_on_epoch(self, model, optimizer):
        model.train()

        data_loader = self.data_loaders[0]
        running_loss_depth = 0.0
        running_loss_mask = 0.0
        running_loss = 0.0
        fuseTrans = self.cfg.fuseTrans

        for self.iteration, batch in enumerate(data_loader, self.iteration):
            input_images, renderTrans, depthGT, maskGT = utils.unpack_batch_novel(batch, self.cfg.device)

            with torch.set_grad_enabled(True):
                optimizer.zero_grad()

                XYZ, maskLogit = model(input_images)
                # ------ build transformer ------
                XYZid, ML = transform.fuse3D(
                    self.cfg, XYZ, maskLogit, fuseTrans) # [B,3,VHW],[B,1,VHW]
                newDepth, newMaskLogit, collision = transform.render2D(
                    self.cfg, XYZid, ML, renderTrans)  # [B,N,H,W,1]
                # ------ Compute loss ------
                loss_depth = self.l1(
                    newDepth.masked_select(collision==1),
                    depthGT.masked_select(collision==1))
                loss_mask = self.sigmoid_bce(newMaskLogit, maskGT)
                loss = loss_mask + self.cfg.lambdaDepth * loss_depth

                # Update weights
                loss.backward()
                # True Weight decay
                if self.cfg.trueWD is not None:
                    for group in optimizer.param_groups:
                        for param in group['params']:
                            param.data = param.data.add(
                                -self.cfg.trueWD * group['lr'], param.data)
                optimizer.step()

            if self.on_after_batch is not None:
                if self.cfg.lrSched.lower() in "cyclical":
                    self.on_after_batch(self.iteration)
                else: self.on_after_batch(self.epoch)

            running_loss_depth += loss_depth.item() * input_images.size(0)
            running_loss_mask += loss_mask.item() * input_images.size(0)
            running_loss += loss.item() * input_images.size(0)

        epoch_loss_depth = running_loss_depth / len(data_loader.dataset)
        epoch_loss_mask = running_loss_mask / len(data_loader.dataset)
        epoch_loss = running_loss / len(data_loader.dataset)

        print(f"\tTrain loss: {epoch_loss}")

        return {"epoch_loss_depth": epoch_loss_depth,
                "epoch_loss_mask": epoch_loss_mask,
                "epoch_loss": epoch_loss, }
    def findLR(self, model, optimizer, writer,
               start_lr=1e-7, end_lr=10, num_iters=50):
        model.train()

        losses = []
        lrs = np.logspace(np.log10(start_lr), np.log10(end_lr), num_iters)

        for lr in lrs:
            # Update LR
            for group in optimizer.param_groups: group['lr'] = lr

            batch = next(iter(self.data_loaders[0]))
            input_images, depthGT, maskGT = utils.unpack_batch_fixed(batch, self.cfg.device)
            # ------ define ground truth------
            XGT, YGT = torch.meshgrid([torch.arange(self.cfg.outH), # [H,W]
                                       torch.arange(self.cfg.outW)]) # [H,W]
            XGT, YGT = XGT.float(), YGT.float()
            XYGT = torch.cat([
                XGT.repeat([self.cfg.outViewN, 1, 1]), 
                YGT.repeat([self.cfg.outViewN, 1, 1])], dim=0) #[2V,H,W]
            XYGT = XYGT.unsqueeze(dim=0).to(self.cfg.device) #[1,2V,H,W]

            with torch.set_grad_enabled(True):
                optimizer.zero_grad()

                XYZ, maskLogit = model(input_images)
                XY = XYZ[:, :self.cfg.outViewN * 2, :, :]
                depth = XYZ[:, self.cfg.outViewN * 2:self.cfg.outViewN * 3, :,  :]
                mask = (maskLogit > 0).byte()
                # ------ Compute loss ------
                loss_XYZ = self.l1(XY, XYGT)
                loss_XYZ += self.l1(depth.masked_select(mask),
                                    depthGT.masked_select(mask))
                loss_mask = self.sigmoid_bce(maskLogit, maskGT)
                loss = loss_mask + self.cfg.lambdaDepth * loss_XYZ

                # Update weights
                loss.backward()
                # True Weight decay
                if self.cfg.trueWD is not None:
                    for group in optimizer.param_groups:
                        for param in group['params']:
                            param.data = param.data.add(
                                -self.cfg.trueWD * group['lr'], param.data)
                optimizer.step()

            losses.append(loss.item())

        fig, ax = plt.subplots()
        ax.plot(lrs, losses)
        ax.set_xlabel('learning rate')
        ax.set_ylabel('loss')
        ax.set_xscale('log')
        writer.add_figure('findLR', fig)
    def findLR(self, model, optimizer, writer,
               start_lr=1e-7, end_lr=10, num_iters=50):

        model.train()

        lrs = np.logspace(np.log10(start_lr), np.log10(end_lr), num_iters)
        losses = []
        fuseTrans = self.cfg.fuseTrans

        for lr in lrs:
            # Update LR
            for group in optimizer.param_groups:
                group['lr'] = lr

            batch = next(iter(self.data_loaders[0]))
            input_images, renderTrans, depthGT, maskGT = utils.unpack_batch_novel(batch, self.cfg.device)

            with torch.set_grad_enabled(True):
                optimizer.zero_grad()

                XYZ, maskLogit = model(input_images)
                # ------ build transformer ------
                XYZid, ML = transform.fuse3D(
                    self.cfg, XYZ, maskLogit, fuseTrans) # [B,3,VHW],[B,1,VHW]
                newDepth, newMaskLogit, collision = transform.render2D(
                    self.cfg, XYZid, ML, renderTrans)  # [B,N,H,W,1]
                # ------ Compute loss ------
                loss_depth = self.l1(
                    newDepth.masked_select(collision==1),
                    depthGT.masked_select(collision==1))
                loss_mask = self.sigmoid_bce(newMaskLogit, maskGT)
                loss = loss_mask + self.cfg.lambdaDepth * loss_depth

                # Update weights
                loss.backward()
                # True Weight decay
                if self.cfg.trueWD is not None:
                    for group in optimizer.param_groups:
                        for param in group['params']:
                            param.data = param.data.add(
                                -self.cfg.trueWD * group['lr'],
                                param.data)
                optimizer.step()

            losses.append(loss.item())

        fig, ax = plt.subplots()
        ax.plot(lrs, losses)
        ax.set_xlabel('learning rate')
        ax.set_ylabel('loss')
        ax.set_xscale('log')
        writer.add_figure('findLR', fig)
 def predict_batch(self, source, input_lengths, num_exams):
     torch.set_grad_enabled(False)
     output_seq = []
     input_variables = source
     for i in range(source.size(0)):
         title_id_seq = [input_variables[i][di].item() for di in range(input_lengths[i])]
         title_seq = [self.vectorizer.idx2word[tok] for tok in title_id_seq]
         title = ' '.join([k for k in title_seq if k != '<PAD>' and k != '<EOS>' and k != '<SOS>'])
         output_seq.append([title])
     prev_generated_seq = None
     for k in range(num_exams):
         _, _, other = \
             self.model(input_variables, prev_generated_seq, input_lengths)
         length = other['length']
         sequence = torch.stack(other['sequence'], 1).squeeze(2)
         prev_generated_seq = self._mask(sequence)
         for i in range(len(length)):
             opt_id_seq = [other['sequence'][di][i].item() for di in range(length[i])]
             opt_seq = [self.vectorizer.idx2word[tok] for tok in opt_id_seq]
             output = ' '.join([k for k in opt_seq if k != '<PAD>' and k != '<EOS>' and k != '<SOS>'])
             output_seq[i].append(output)
     return output_seq
예제 #17
0
파일: gan.py 프로젝트: rdevon/cortex
    def contractive_penalty(self, network, input, penalty_amount=0.5):

        if penalty_amount == 0.:
            return

        if not isinstance(input, (list, tuple)):
            input = [input]

        input = [inp.detach() for inp in input]
        input = [inp.requires_grad_() for inp in input]

        with torch.set_grad_enabled(True):
            output = network(*input)
        gradient = self._get_gradient(input, output)
        gradient = gradient.view(gradient.size()[0], -1)
        penalty = (gradient ** 2).sum(1).mean()

        return penalty_amount * penalty
    def _val_on_epoch(self, model):
        model.eval()

        data_loader = self.data_loaders[1]
        running_loss_XYZ = 0.0
        running_loss_mask = 0.0
        running_loss = 0.0

        for batch in data_loader:
            input_images, depthGT, maskGT = utils.unpack_batch_fixed(batch, self.cfg.device)
            # ------ define ground truth------
            XGT, YGT = torch.meshgrid([
                torch.arange(self.cfg.outH), # [H,W]
                torch.arange(self.cfg.outW)]) # [H,W]
            XGT, YGT = XGT.float(), YGT.float()
            XYGT = torch.cat([
                XGT.repeat([self.cfg.outViewN, 1, 1]), 
                YGT.repeat([self.cfg.outViewN, 1, 1])], dim=0) #[2V,H,W]
            XYGT = XYGT.unsqueeze(dim=0).to(self.cfg.device) # [1,2V,H,W] 

            with torch.set_grad_enabled(False):
                XYZ, maskLogit = model(input_images)
                XY = XYZ[:, :self.cfg.outViewN * 2, :, :]
                depth = XYZ[:, self.cfg.outViewN * 2:self.cfg.outViewN*3,:,:]
                mask = (maskLogit > 0).byte()
                # ------ Compute loss ------
                loss_XYZ = self.l1(XY, XYGT)
                loss_XYZ += self.l1(depth.masked_select(mask),
                                    depthGT.masked_select(mask))
                loss_mask = self.sigmoid_bce(maskLogit, maskGT)
                loss = loss_mask + self.cfg.lambdaDepth * loss_XYZ

            running_loss_XYZ += loss_XYZ.item() * input_images.size(0)
            running_loss_mask += loss_mask.item() * input_images.size(0)
            running_loss += loss.item() * input_images.size(0)

        epoch_loss_XYZ = running_loss_XYZ / len(data_loader.dataset)
        epoch_loss_mask = running_loss_mask / len(data_loader.dataset)
        epoch_loss = running_loss / len(data_loader.dataset)

        print(f"\tVal loss: {epoch_loss}")
        return {"epoch_loss_XYZ": epoch_loss_XYZ,
                "epoch_loss_mask": epoch_loss_mask,
                "epoch_loss": epoch_loss, }
    def _val_on_epoch(self, model):
        model.eval()

        data_loader = self.data_loaders[1]
        running_loss_depth = 0.0
        running_loss_mask = 0.0
        running_loss = 0.0
        fuseTrans = self.cfg.fuseTrans

        for batch in data_loader:
            input_images, renderTrans, depthGT, maskGT = utils.unpack_batch_novel(batch, self.cfg.device)

            with torch.set_grad_enabled(False):
                XYZ, maskLogit = model(input_images)
                # ------ build transformer ------
                XYZid, ML = transform.fuse3D(
                    self.cfg, XYZ, maskLogit, fuseTrans) # [B,3,VHW],[B,1,VHW]
                newDepth, newMaskLogit, collision = transform.render2D(
                    self.cfg, XYZid, ML, renderTrans)  # [B,N,H,W,1]
                # ------ Compute loss ------
                loss_depth = self.l1(
                    newDepth.masked_select(collision==1),
                    depthGT.masked_select(collision==1))
                loss_mask = self.sigmoid_bce(newMaskLogit, maskGT)
                loss = loss_mask + self.cfg.lambdaDepth * loss_depth

            running_loss_depth += loss_depth.item() * input_images.size(0)
            running_loss_mask += loss_mask.item() * input_images.size(0)
            running_loss += loss.item() * input_images.size(0)

        epoch_loss_depth = running_loss_depth / len(data_loader.dataset)
        epoch_loss_mask = running_loss_mask / len(data_loader.dataset)
        epoch_loss = running_loss / len(data_loader.dataset)

        print(f"\tVal loss: {epoch_loss}")

        return {"epoch_loss_depth": epoch_loss_depth,
                "epoch_loss_mask": epoch_loss_mask,
                "epoch_loss": epoch_loss, }
    def _make_images_board(self, model):
        model.eval()
        num_imgs = 64

        batch = next(iter(self.data_loaders[1]))
        input_images, depthGT, maskGT = utils.unpack_batch_fixed(batch, self.cfg.device)

        with torch.set_grad_enabled(False):
            XYZ, maskLogit = model(input_images)
            XY = XYZ[:, :self.cfg.outViewN * 2, :, :]
            depth = XYZ[:, self.cfg.outViewN * 2:self.cfg.outViewN * 3, :,  :]
            mask = (maskLogit > 0).float()

        return {'RGB': utils.make_grid(input_images[:num_imgs]),
                'depth': utils.make_grid(1-depth[:num_imgs, 0:1, :, :]),
                'depth_mask': utils.make_grid(
                    ((1-depth)*mask)[:num_imgs, 0:1, :, :]),
                'depthGT': utils.make_grid(
                    1-depthGT[:num_imgs, 0:1, :, :]),
                'mask': utils.make_grid(
                    torch.sigmoid(maskLogit[:num_imgs, 0:1,:, :])),
                'maskGT': utils.make_grid(maskGT[:num_imgs, 0:1, :, :]),
                }
예제 #21
0
파일: gan.py 프로젝트: rdevon/cortex
    def interpolate_penalty(self, network, input, penalty_amount=0.5):

        input = input.detach()
        input = input.requires_grad_()

        if len(input) != 2:
            raise ValueError('tuple of 2 inputs required to interpolate')
        inp1, inp2 = input

        try:
            epsilon = network.inputs.e.view(-1, 1, 1, 1)
        except AttributeError:
            raise ValueError('You must initiate a uniform random variable'
                             '`e` to use interpolation')
        mid_in = ((1. - epsilon) * inp1 + epsilon * inp2)
        mid_in.requires_grad_()

        with torch.set_grad_enabled(True):
            mid_out = network(mid_in)
        gradient = self._get_gradient(mid_in, mid_out)
        gradient = gradient.view(gradient.size()[0], -1)
        penalty = ((gradient.norm(2, dim=1) - 1.) ** 2).mean()

        return penalty_amount * penalty
예제 #22
0
    def step(self, data, mode='train'):
        torch.cuda.empty_cache()
        if self.speed_benchmark:
            step_start = time.time()
        with torch.set_grad_enabled(mode == 'train'):
            np.random.seed()
            self.optimizerF.zero_grad()

            MSEcriterion = torch.nn.MSELoss()
            BCEcriterion = torch.nn.BCELoss()
            CEcriterion = nn.CrossEntropyLoss(
                weight=self.class_balance_weights, reduce=False)

            rgb, norm, depth, dataMask, Q = v(data['rgb']), v(data['norm']), v(
                data['depth']), v(data['dataMask']), v(data['Q'])
            segm = v(data['segm'])
            segm = torch.cat((segm[:, 0, :, :, :], segm[:, 1, :, :, :]))
            errG_rgb, errG_d, errG_n, errG_k, errG_s = torch.FloatTensor(
                [0]), torch.FloatTensor([0]), torch.FloatTensor(
                    [0]), torch.FloatTensor([0]), torch.FloatTensor([0])

            n = Q.shape[0]

            # compose the input: [rgb, normal, depth]
            complete0 = torch.cat(
                (rgb[:, 0, :, :, :], norm[:, 0, :, :, :], depth[:, 0:1, :, :]),
                1)
            complete1 = torch.cat(
                (rgb[:, 1, :, :, :], norm[:, 1, :, :, :], depth[:, 1:2, :, :]),
                1)

            view0, mask0, geow0 = apply_mask(complete0.clone(),
                                             self.args.maskMethod,
                                             self.args.ObserveRatio)
            view1, mask1, geow1 = apply_mask(complete1.clone(),
                                             self.args.maskMethod,
                                             self.args.ObserveRatio)
            view = torch.cat((view0, view1))
            mask = torch.cat((mask0, mask1))

            # mask the pano
            complete = torch.cat((complete0, complete1))
            dataMask = torch.cat(
                (dataMask[:, 0, :, :, :], dataMask[:, 1, :, :, :]))

            fakec = self.netF(complete)
            segm_pred = self.netSemg(fakec)

            featMapsc = fakec[:n]
            featMaptc = fakec[n:]

            denseCorres = data['denseCorres']
            validCorres = torch.nonzero(
                denseCorres['valid'] == 1).view(-1).long()

            if not len(validCorres):
                loss_fl_pos = torch_op.v(np.array([0]))[0]
                loss_fl_neg = torch_op.v(np.array([0]))[0]
                loss_fl = torch_op.v(np.array([0]))[0][0]
                loss_fc = torch_op.v(np.array([0]))[0]
                loss_fl_pos_f = torch_op.v(np.array([0]))[0]
                loss_fl_neg_f = torch_op.v(np.array([0]))[0]
                loss_fl_f = torch_op.v(np.array([0]))[0]
            else:
                # categorize each correspondence by whether it contain unobserved point
                allCorres = torch.cat(
                    (denseCorres['idxSrc'], denseCorres['idxTgt']))
                corresShape = allCorres.shape
                allCorres = allCorres.view(-1, 2).long()
                typeIdx = torch.arange(corresShape[0]).view(-1, 1).repeat(
                    1, corresShape[1]).view(-1).long()
                typeIcorresP = mask[typeIdx, 0, allCorres[:, 1], allCorres[:,
                                                                           0]]
                typeIcorresP = typeIcorresP.view(2, -1, corresShape[1]).sum(0)
                denseCorres['observe'] = typeIcorresP

                # consistency of keypoint proposal across different view
                idxInst = torch.arange(n)[validCorres].view(-1, 1).repeat(
                    1, denseCorres['idxSrc'].shape[1]).view(-1).long()
                featS = featMapsc[idxInst, :,
                                  denseCorres['idxSrc'][validCorres, :,
                                                        1].view(-1).long(),
                                  denseCorres['idxSrc'][validCorres, :,
                                                        0].view(-1).long()]
                featT = featMaptc[idxInst, :,
                                  denseCorres['idxTgt'][validCorres, :,
                                                        1].view(-1).long(),
                                  denseCorres['idxTgt'][validCorres, :,
                                                        0].view(-1).long()]

                # positive example,
                loss_fl_pos = (featS - featT).pow(2).sum(1).mean()

                # negative example, make sure does not contain positive
                Kn = denseCorres['idxSrc'].shape[1]
                C = featMapsc.shape[1]

                negIdy = torch.from_numpy(
                    np.random.choice(range(featMapsc.shape[2]),
                                     Kn * 100 * len(validCorres)))
                negIdx = torch.from_numpy(
                    np.random.choice(range(featMapsc.shape[3]),
                                     Kn * 100 * len(validCorres)))
                idx = torch.arange(n)[validCorres].view(-1, 1).repeat(
                    1, Kn * 100).view(-1).long()

                loss_fl_neg = F.relu(self.args.D - (
                    featS.unsqueeze(1).repeat(1, 100, 1).view(-1, C) -
                    featMaptc[idx, :, negIdy, negIdx]).pow(2).sum(1)).mean()
                loss_fl = loss_fl_pos + loss_fl_neg

            errG = loss_fl
            total_weight = dataMask
            if self.args.featlearnSegm:
                errG_s = (CEcriterion(segm_pred,
                                      segm.squeeze(1).long()) *
                          total_weight).mean() * 0.1
                errG += errG_s

            if mode == 'train' and len(validCorres) > 0:
                errG.backward()
                self.optimizerF.step()

            self.logger_errG.update(errG.data, Q.size(0))

            self.logger_errG_fl.update(loss_fl.data, Q.size(0))
            self.logger_errG_fl_pos.update(loss_fl_pos.data, Q.size(0))
            self.logger_errG_fl_neg.update(loss_fl_neg.data, Q.size(0))

            suffix = f"| errG {self.logger_errG.avg:.6f}| errG_fl {self.logger_errG_fl.avg:.6f}\
                 | errG_fl_pos {self.logger_errG_fl_pos.avg:.6f} | errG_fl_neg {self.logger_errG_fl_neg.avg:.6f} | errG_fc {self.logger_errG_fc.avg:.6f} | errG_pn {self.logger_errG_pn.avg:.6f} | errG_freq {self.logger_errG_freq.avg:.6f}"

            if self.global_step % getattr(self.learnerParam,
                                          f"{mode}_step_vis") == 0:
                if mode != 'train':
                    with torch.set_grad_enabled(False):

                        if len(validCorres):
                            self.evalFeatRatioSift.extend(
                                self.evalSiftDescriptor(rgb, denseCorres))
                            obs, unobs, visCPc = self.evalDLDescriptor(
                                featMapsc, featMaptc, denseCorres,
                                complete0[:, 0:3, :, :],
                                complete1[:, 0:3, :, :], mask[0:1, 0:1, :, :])
                            self.evalFeatRatioDLc_obs.extend(obs)
                            self.evalFeatRatioDLc_unobs.extend(unobs)
                            visCPdir = os.path.join(
                                self.args.EXP_DIR_SAMPLES,
                                f"step_{self.global_step}")
                            if not os.path.exists(visCPdir): os.mkdir(visCPdir)
                            for ii in range(len(visCPc)):
                                cv2.imwrite(
                                    os.path.join(visCPdir,
                                                 f"complete_{ii}.png"),
                                    visCPc[ii])
                vis = []
                # draw semantic
                viss = segm
                vissf = segm_pred
                vissf = torch.argmax(vissf, 1, keepdim=True).float()
                viss = torch.cat((vissf, viss), 2)
                visstp = torch_op.npy(viss)
                visstp = np.expand_dims(np.squeeze(visstp, 1), 3)
                visstp = self.colors[
                    visstp.flatten().astype('int'), :].reshape(
                        visstp.shape[0], visstp.shape[1], visstp.shape[2], 3)
                viss = torch_op.v(visstp.transpose(0, 3, 1, 2)) / 255.
                vis.append(viss)
                vis = torch.cat(vis, 2)[::2]
                permute = [2, 1, 0]  # bgr to rgb
                vis = vis[:, permute, :, :]
                train_op.tboard_add_img(self.tensorboardX, vis, f"{mode}/loss",
                                        self.global_step)

            if self.global_step % getattr(self.learnerParam,
                                          f"{mode}_step_log") == 0:
                self.tensorboardX.add_scalars('data/errG_fl',
                                              {f"{mode}_complete": loss_fl},
                                              self.global_step)
                self.tensorboardX.add_scalars(
                    'data/errG_fl_pos', {f"{mode}_complete": loss_fl_pos},
                    self.global_step)
                self.tensorboardX.add_scalars(
                    'data/errG_fl_neg', {f"{mode}_complete": loss_fl_neg},
                    self.global_step)
                self.tensorboardX.add_scalars('data/errG_s',
                                              {f"{mode}": errG_s},
                                              self.global_step)

            summary = {'suffix': suffix}
            self.global_step += 1

        if self.speed_benchmark:
            self.time_per_step.update(time.time() - step_start, 1)
            print(f"time elapse per step: {self.time_per_step.avg}")
        return dotdict(summary)
예제 #23
0
def loop(mode,
         data,
         outer_steps,
         inner_steps,
         log_steps,
         fig_epochs,
         inner_lr,
         log_mask=True,
         unroll_steps=None,
         meta_batchsize=0,
         sampler=None,
         epoch=1,
         outer_optim=None,
         save_path=None,
         is_RL=False):
    #####################################################################
    """Args:
      meta_batchsize(int): If meta_batchsize |m| > 0, gradients for multiple
        unrollings from each episodes size of |m| will be accumulated in
        sequence but updated all at once. (Which can be done in parallel when
        VRAM is large enough, but will be simulated in this code.)
        If meta_batchsize |m| = 0(default), then update will be performed after
        each unrollings.
  """
    assert mode in ['train', 'valid', 'test']
    assert meta_batchsize >= 0
    print(f'Start_of_{mode}.')
    if mode == 'train' and unroll_steps is None:
        raise Exception("unroll_steps has to be specied when mode='train'.")
    if mode != 'train' and unroll_steps is not None:
        raise Warning("unroll_steps has no effect when mode mode!='train'.")

    train = True if mode == 'train' else False
    force_base = True
    # TODO: to gin configuration
    fc_pulling = False  # does not support for now
    class_balanced = False
    if class_balanced:
        loader_cfg = LoaderConfig(class_size=10, sample_size=3, num_workers=4)
    else:
        loader_cfg = LoaderConfig(batch_size=128, num_workers=4)

    sample_split_ratio = 0.5
    # sample_split_ratio = None
    anneal_outer_steps = 50
    concrete_resample = True
    detach_param = False
    split_method = {1: 'inclusive', 2: 'exclusive'}[2]
    sampler_type = {1: 'pre_sampler', 2: 'post_sampler'}[2]
    #####################################################################
    mask_unit = {
        0: MaskUnit.SAMPLE,
        1: MaskUnit.CLASS,
    }[0]
    mask_dist = {
        0: MaskDist.SOFT,
        1: MaskDist.DISCRETE,
        2: MaskDist.CONCRETE,
        3: MaskDist.RL,
    }[3 if is_RL else 2]
    mask_mode = MaskMode(mask_unit, mask_dist)
    #####################################################################

    # scheduler
    inner_step_scheduler = InnerStepScheduler(outer_steps, inner_steps,
                                              anneal_outer_steps)

    if split_method == 'exclusive':
        meta_support, meta_query = data.split_classes(
            (('Support', 1), ('Query', 5)))  # 1(100) : 4(400)
    elif split_method == 'inclusive':
        meta_support, meta_query = data.split_instances(
            (('Support', 5), ('Query', 5)))  # 5:5 instances

    meta_s_loader0 = meta_support.dataset_loader(loader_cfg)
    meta_s_loader1 = meta_support.episode_loader(loader_cfg)

    l0 = meta_s_loader0()
    print(l0[1])
    print(l0[:2])
    print(l0.classwise[1])
    print(l0.classwise[:2])

    l1 = meta_s_loader1()
    print(l1[1])
    print(l1[:2])
    print(l1.classwise[1])
    print(l1.classwise[:2])

    fake_mask = torch.tensor([True, False] * 5)
    l0 = meta_s_loader0()
    print(l0)
    sample_l0 = l0.masked_select(fake_mask)
    print(sample_l0)
    class_l0 = l0.classwise.masked_select(fake_mask)
    print(class_l0)

    l1 = meta_s_loader1()
    print(l1)
    sample_l1 = l1.masked_select(fake_mask)
    print(sample_l1)
    class_l1 = l1.classwise.masked_select(fake_mask)
    print(class_l1)

    # sss.get_classes[:3]
    import pdb
    pdb.set_trace()

    if train:
        if meta_batchsize > 0:
            # serial processing of meta-minibatch
            update_epochs = meta_batchsize
            update_steps = None
        else:
            #  update at every unrollings
            update_steps = unroll_steps
            update_epochs = None
        assert (update_epochs is None) != (update_steps is None)

    # for result recordin
    result_frame = ResultFrame()
    if save_path:
        writer = SummaryWriter(os.path.join(save_path, 'tfevent'))

    ##################################
    if is_RL:
        env = Environment()
        policy = Policy(sampler)
        neg_rw = None
    ##################################

    for i in range(1, outer_steps + 1):
        outer_loss = 0
        result_dict = ResultDict()

        # initialize sampler
        sampler.initialize()
        # initialize base learner
        model_q = Model(len(meta_support), mode='metric')

        if fc_pulling:
            model_s = Model(len(meta_support), mode='fc')
            params = C(model_s.get_init_params('ours'))
        else:
            model_s = model_q
            params = C(model_s.get_init_params('ours'))

        ##################################
        if is_RL:
            policy.reset()
        # env.reset()
        ##################################

        if not train or force_base:
            """baseline 0: naive single task learning
         baseline 1: single task learning with the same loss scale
      """
            # baseline parameters
            params_b0 = C(params.copy('b0'), 4)
            params_b1 = C(params.copy('b1'), 4)

        do_sample = True
        for k in range(1, inner_step_scheduler(i, verbose=True)):
            outs = []
            #####################################################################
            if do_sample:
                do_sample = False
                meta_s_loader = meta_s.get_dataset_loader(
                    loader_cfg, 'Support')
                # task encoding (very first step and right after a meta-update)
                with torch.set_grad_enabled(train):

                    def feature_fn():
                        # determein whether to untilize model features
                        if sampler_type == 'post_sampler':
                            return model_s(meta_s, params)
                        elif sampler_type == 'pre_sampler':
                            return None

                    # sampler do the work!
                    mask, lr_ = sampler(mask_mode, feature_fn)

                    # out_for_sampler = model_s(meta_s, params, debug=do_sample)
                    # mask_, lr = sampler(
                    #     pairwise_dist=out_for_sampler.pairwise_dist,
                    #     classwise_loss=out_for_sampler.loss,
                    #     classwise_acc=out_for_sampler.acc,
                    #     n_classes=out_for_sampler.n_classes,
                    #     mask_mode=mask_mode,
                    # )
                    # sample from concrete distribution
                    #   while keeping original distribution for simple resampling
                    if mask_mode.dist is MaskDist.CONCRETE:
                        mask = mask_.rsample()
                    else:
                        mask = mask_

                    if is_RL:
                        mask, neg_rw = policy.predict(mask)
                        if neg_rw:
                            # TODO fix iteratively [0 class]s are sampled.
                            do_sample = True
                            print('[!] select 0 class!')
                            policy.rewards.append(neg_rw)
                            import pdb
                            pdb.set_trace()
                            # policy.update()
                            continue
            else:
                # we can simply resample masks when using concrete distribution
                #   without seriously going through the sampler
                if mask_mode.dist is MaskDist.CONCRETE and concrete_resample:
                    mask = mask_.rsample()
            #####################################################################

            # use learned learning rate if available
            # lr = inner_lr if lr is None else lr  # inner_lr: preset / lr: learned

            # train on support set
            params, mask = C([params, mask], 2)
            #####################################################################
            out_s = model_s(meta_s, params, mask=mask, mask_mode=mask_mode)
            # out_s_loss_masked = out_s.loss_masked
            outs.append(out_s)

            # inner gradient step
            out_s_loss_mean = out_s.loss.mean() if mask_mode == MaskMode.RL \
                else out_s.loss_masked_mean
            out_s_loss_mean, lr = C([out_s_loss_mean, lr], 2)

            params = params.sgd_step(
                out_s_loss_mean,
                lr,
                second_order=False if is_RL else True,
                detach_param=True if is_RL else detach_param)
            #####################################################################

            # baseline
            if not train or force_base:
                out_s_b0 = model_s(meta_s, params_b0)
                out_s_b1 = model_s(meta_s, params_b1)
                outs.extend([out_s_b0, out_s_b1])

                # attach mask to get loss_s
                out_s_b1.attach_mask(mask)

                # inner gradient step (baseline)
                params_b0 = params_b0.sgd_step(out_s_b0.loss.mean(), inner_lr)
                params_b1 = params_b1.sgd_step(out_s_b1.loss_scaled_mean,
                                               lr.detach())

            meta_s = meta_s.cpu()
            meta_q = meta_q.cuda()

            # test on query set
            with torch.set_grad_enabled(train):
                params = C(params, 3)
                out_q = model_q(meta_q, params)
                outs.append(out_q)

            # baseline
            if not train or force_base:
                with torch.no_grad():
                    # test on query set
                    out_q_b0 = model_q(meta_q, params_b0)
                    out_q_b1 = model_q(meta_q, params_b1)
                    outs.extend([out_q_b0, out_q_b1])

            ##################################
            if is_RL:
                reward = env.step(outs)
                policy.rewards.append(reward)
                outs.append(policy)
            ##################################

            # record result
            result_dict.append(outer_step=epoch * i,
                               inner_step=k,
                               **ModelOutput.as_merged_dict(outs))

            # append to the dataframe
            result_frame = result_frame.append_dict(
                result_dict.index_all(-1).mean_all(-1))

            # logging
            if k % log_steps == 0:
                logger.step_info(epoch, mode, i, outer_steps, k,
                                 inner_step_scheduler(i), lr)
                # logger.split_info(meta_support, meta_query, episode_iterator)
                logger.colorized_mask(mask,
                                      fmt="2d",
                                      vis_num=20,
                                      cond=not sig_1.is_active() and log_mask)
                logger.outputs(outs, print_conf=sig_1.is_active())
                logger.flush()

            # to debug in the middle of running process.
            if k == inner_steps and sig_2.is_active():
                import pdb
                pdb.set_trace()

            # compute outer gradient
            if train and (k % unroll_steps == 0 or k == inner_steps):
                #####################################################################
                if not is_RL:
                    outer_loss += out_q.loss.mean()
                    outer_loss.backward()
                    outer_loss = 0
                    params.detach_().requires_grad_()
                mask = mask.detach()
                lr = lr.detach()
                do_sample = True
            #####################################################################

            if not train:
                if not is_RL:
                    # when params is not leaf node created by user,
                    #   requires_grad attribute is False by default.
                    params.requires_grad_()

            # meta(outer) learning
            if train and update_steps and k % update_steps == 0:
                # when you have meta_batchsize == 0, update_steps == unroll_steps
                if is_RL:
                    policy.update()
                else:
                    outer_optim.step()
                    sampler.zero_grad()
            ### end of inner steps (k) ###

        if train and update_epochs and i % update_epochs == 0:
            # when you have meta_batchsize > 0, update_epochs == meta_batchsize
            if is_RL:
                policy.update()
            else:
                outer_optim.step()
                sampler.zero_grad()
            if update_epochs:
                print(f'Meta-batchsize is {meta_batchsize}: Sampler updated.')

        if train and update_steps:
            print(f'Meta-batchsize is zero. Updating after every unrollings.')

        # tensorboard
        if save_path and train:
            step = (epoch * (outer_steps - 1)) + i
            res = ResultFrame(result_frame[result_frame['outer_step'] == i])
            loss = res.get_best_loss().mean()
            acc = res.get_best_acc().mean()
            writer.add_scalars('Loss/train', {n: loss[n]
                                              for n in loss.index}, step)
            writer.add_scalars('Acc/train', {n: acc[n]
                                             for n in acc.index}, step)

        # dump figures
        if save_path and i % fig_epochs == 0:
            # meta_s.s.save_fig(f'imgs/meta_support', save_path, i)
            # meta_q.s.save_fig(f'imgs/meta_query', save_path, i)
            result_dict['ours_s_mask'].save_fig(f'imgs/masks', save_path, i)
            result_dict.get_items([
                'ours_s_mask', 'ours_s_loss', 'ours_s_loss_masked',
                'b0_s_loss', 'b1_s_loss', 'ours_q_loss', 'b0_q_loss',
                'b1_q_loss'
            ]).save_csv(f'classwise/{mode}', save_path, i)

        # distinguishable episodes
        if not i == outer_steps:
            print(f'Path for saving: {save_path}')
            print(f'End_of_episode: {i}')

        ### end of episode (i) ###

    print(f'End_of_{mode}.')
    # del metadata
    return sampler, result_frame
예제 #24
0
def train_model(model, criterion, optimizer, scheduler, num_epochs=no_epochs):
    since = time.time()

    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        #each epoch has a training and validation phase
        for phase in ['train', 'val']:
            if phase == 'train':
                scheduler.step()
                model.train()  #set model to training mode
            else:
                model.eval()  #set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            #iterate over data.
            for inputs, labels in dataloaders[phase]:
                inputs = inputs.to(device)
                labels = labels.to(device)

                #zero the parameter gradients
                optimizer.zero_grad()

                #forward
                #track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    _, preds = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)

                    #backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                #statistics
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)

            epoch_loss = running_loss / dataset_sizes[phase]
            epoch_acc = running_corrects.double() / dataset_sizes[phase]

            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss,
                                                       epoch_acc))

            #deep copy the model
            if phase == 'val' and epoch_acc > best_acc:
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())

        print()

    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: {:4f}'.format(best_acc))

    #load best model weights
    model.load_state_dict(best_model_wts)
    return model
예제 #25
0
    return results


def transcribe(audio_path, parser, model, decoder, cuda=False):
    spect = parser.parse_audio(audio_path).contiguous()
    spect = spect.view(1, 1, spect.size(0), spect.size(1))
    if cuda:
        spect = spect.cuda()
    input_sizes = torch.IntTensor([spect.size(3)]).int()
    out, output_sizes = model(spect, input_sizes)
    decoded_output, decoded_offsets = decoder.decode(out, output_sizes)
    return decoded_output, decoded_offsets


if __name__ == '__main__':
    torch.set_grad_enabled(False)
    model = DeepSpeech.load_model(args.model_path)
    if args.cuda:
        model.cuda()
    model.eval()

    labels = DeepSpeech.get_labels(model)
    audio_conf = DeepSpeech.get_audio_conf(model)

    if args.decoder == "beam":
        from decoder import BeamCTCDecoder

        decoder = BeamCTCDecoder(labels, lm_path=args.lm_path, alpha=args.alpha, beta=args.beta,
                                 cutoff_top_n=args.cutoff_top_n, cutoff_prob=args.cutoff_prob,
                                 beam_width=args.beam_width, num_processes=args.lm_workers)
    else:
예제 #26
0
def train(epoch, phase='train'):
    global global_step, best_loss, best_metric, best_accuracy

    if phase == 'train':
        writer.add_scalar('%s/learning_rate' % phase, get_lr(), epoch)

    model.train() if phase == 'train' else model.eval()
    torch.set_grad_enabled(True) if phase == 'train' else torch.set_grad_enabled(False)
    dataloader = train_dataloader if phase == 'train' else valid_dataloader

    running_loss, running_metric, running_accuracy = 0.0, 0.0, 0.0
    worst_loss, worst_metric = best_loss, best_metric
    it, total = 0, 0

    if phase == 'valid':
        total_probs = []
        total_truth = []

    pbar_disable = False if epoch == start_epoch else None
    pbar = tqdm(dataloader, unit="images", unit_scale=dataloader.batch_size, disable=pbar_disable)
    for batch in pbar:
        image_ids, inputs, targets = batch['image_id'], batch['input'], batch['mask']

        if use_gpu:
            inputs = inputs.cuda()
            targets = targets.cuda()

        # forward
        logit, logit_pixel, logit_image = model(inputs)

        # look at the center only
        if args.loss_on_center:
            logit = remove_padding(logit)
            logit_pixel = (remove_padding(l) for l in logit_pixel)
            targets = remove_padding(targets)

        truth_pixel = targets
        truth_image = (truth_pixel.sum(dim=(1, 2)) > 0).float()
        loss = models.deep_supervised_criterion(logit, logit_pixel, logit_image, truth_pixel, truth_image)

        if not args.loss_on_center and not args.resize:
            logit = remove_padding(logit)
            targets = remove_padding(targets)

        probs = torch.sigmoid(logit).squeeze(1)
        # predictions = probs.squeeze(1) > 0.5

        if phase == 'train':
            # backward
            optimizer.backward(loss / args.gradient_accumulation)
            if it % args.gradient_accumulation == 0:
                optimizer.step()
                optimizer.zero_grad()

        # statistics
        it += 1
        global_step += 1
        loss = loss.item()
        running_loss += (loss * targets.size(0))
        total += targets.size(0)

        writer.add_scalar('%s/loss' % phase, loss, global_step)

        targets_numpy = targets.cpu().numpy()
        probs_numpy = probs.cpu().detach().numpy()
        predictions_numpy = probs_numpy > 0.5  # predictions.cpu().numpy()
        metric_array = calc_metric(targets_numpy, predictions_numpy, type='iou', size_average=False)
        metric = metric_array.mean()
        running_metric += metric_array.sum()

        running_accuracy += calc_metric(targets_numpy, predictions_numpy, type='pixel_accuracy',
                                        size_average=False).sum()

        if phase == 'valid':
            total_truth.append(targets_numpy)
            total_probs.append(probs_numpy)

        visualize_output = False
        if worst_loss > loss:
            worst_loss = loss
            visualize_output = True
        if worst_metric < metric:
            worst_metric = metric
            visualize_output = True
        if visualize_output and args.debug:
            # sort samples by metric
            ind = np.argsort(metric_array)
            images = remove_padding(inputs.cpu())
            images = images[ind]
            probs = probs[ind].cpu()
            predictions = predictions[ind].cpu()
            targets = targets[ind].cpu()

            preds = torch.cat([probs] * 3, 1)
            mask = torch.cat([targets.unsqueeze(1)] * 3, 1)
            all = images.clone()
            all[:, 0] = torch.max(images[:, 0], predictions.float())
            all[:, 1] = torch.max(images[:, 1], targets)
            all = torch.cat((torch.cat((all, images), 3), torch.cat((preds, mask), 3)), 2)
            all_grid = vutils.make_grid(all, nrow=4, normalize=False, pad_value=1)
            writer.add_image('%s/img-mask-pred' % phase, all_grid, global_step)

        # update the progress bar
        pbar.set_postfix({
            'loss': "%.05f" % (running_loss / total),
            'metric': "%.03f" % (running_metric / total)
        })

    epoch_loss = running_loss / total
    epoch_metric = running_metric / total
    epoch_accuracy = running_accuracy / total
    writer.add_scalar('%s/metric' % phase, epoch_metric, epoch)
    writer.add_scalar('%s/accuracy' % phase, epoch_accuracy, epoch)
    writer.add_scalar('%s/epoch_loss' % phase, epoch_loss, epoch)

    if phase == 'valid':

        def save_checkpoint(name):
            cycle = ('-cycle%d' % (epoch // args.lr_scheduler_step_size)) if args.lr_scheduler == 'clr' else ''
            model_name = name + '-model'
            model_file_name = '%d-%s-%s%s.pth' % (start_timestamp, model_name, full_name, cycle)
            model_file = models_dir / model_file_name
            models.save(model, model_file)
            mode_file_simple = Path(models_dir / (model_name + '-%s%s.pth' % (args.data_fold, cycle)))
            if mode_file_simple.is_symlink() or mode_file_simple.exists():
                mode_file_simple.unlink()
            mode_file_simple.symlink_to(model_file.relative_to(mode_file_simple.parent))

            checkpoint = {
                'epoch': epoch,
                'step': global_step,
                'model_file': str(model_file),
                'best_loss': best_loss,
                'best_metric': best_metric,
                'best_accuracy': best_accuracy,
                'optimizer': optimizer.state_dict(),
                'lr_scheduler': lr_scheduler.state_dict()
            }
            checkpoint_filename = name + '-checkpoint-%s%s.pth' % (full_name, cycle)
            checkpoint_file = checkpoint_dir / checkpoint_filename
            torch.save(checkpoint, checkpoint_file)
            checkpoint_file_simple = Path(checkpoint_dir / (name + '-checkpoint-%s%s.pth' % (args.data_fold, cycle)))
            if checkpoint_file_simple.is_symlink() or checkpoint_file_simple.exists():
                checkpoint_file_simple.unlink()
            checkpoint_file_simple.symlink_to(checkpoint_file.relative_to(checkpoint_file_simple.parent))

        if epoch_loss < best_loss:
            best_loss = epoch_loss
            save_checkpoint('best-loss')
        if epoch_metric > best_metric:
            best_metric = epoch_metric
            save_checkpoint('best-metric')
        if epoch_accuracy > best_accuracy:
            best_accuracy = epoch_accuracy
            save_checkpoint('best-accuracy')

        save_checkpoint('last')
    return epoch_loss, epoch_metric, epoch_accuracy
예제 #27
0
    def train(self):
        min_val_loss = np.inf
        self.model.to(self.device)  #gpu
        for epoch in range(self.strt, self.epochs + self.strt):
            self.scheduler.step()  #decay lr if it hits milestones

            train_loss = 0.0
            self.model.train()

            for i, batch in enumerate(self.train_loader):
                x, y = enable_cuda(batch, self.device)

                self.optimizer.zero_grad()

                prediction = self.model(x)
                #print(f'prediction : {prediction[0]} target {y[0]}')
                #print(prediction.shape,angles.shape)
                loss = (prediction - y).norm(
                    2).mean() if self.criterion == None else self.criterion(
                        prediction, y)  #.unsqueeze(1))

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

                train_loss += loss.data.item()

                if i % 100 == 0:
                    print(
                        f'Training loss at Epoch: {epoch} | Loss: {train_loss / (i + 1)}'
                    )

                #validation

                self.model.eval()

                val_loss = 0.0

            with torch.set_grad_enabled(False):
                for i, batch in enumerate(self.val_loader):
                    x, y = enable_cuda(batch, self.device)

                    prediction = self.model(x)
                    #print(prediction.shape,angles.shape)
                    loss = (prediction - y).norm(2).mean(
                    ) if self.criterion == None else self.criterion(
                        prediction, y)  #.unsqueeze(1))

                    val_loss += loss.data.item()
                    if i % 100 == 0:
                        print(f'Validation Loss: {val_loss / (i + 1)}')

            if val_loss < min_val_loss:
                min_val_loss = val_loss
                state = {
                    'epoch': epoch + 1,
                    'state_dict': self.model.state_dict(),
                    'optimizer': self.optimizer.state_dict(),
                    'scheduler': self.scheduler.state_dict(),
                }

                self.save(state, "best")
            elif epoch % 5 == 0 or epoch == self.epochs + self.strt - 1:
                min_val_loss = val_loss
                state = {
                    'epoch': epoch + 1,
                    'state_dict': self.model.state_dict(),
                    'optimizer': self.optimizer.state_dict(),
                    'scheduler': self.scheduler.state_dict(),
                }

                self.save(state, "")
예제 #28
0
        dtdata += time.time() - tdata

        tforward = time.time()
        print "coord-shape: flow1=", coord_t.shape
        print "src feats-shape: ", srcpix_t.shape
        print "tarpix_flow1 feats-shape: ", tarpix_flow1_t.shape
        if tarpix_flow2_t is not None:
            print "tarpix_flow2 feats-shape: ", tarpix_flow2_t.shape
        if truth_flow1_t is not None:
            print "truth flow1: ", truth_flow1_t.shape
        if truth_flow2_t is not None:
            print "truth flow2: ", truth_flow2_t.shape
        with torch.autograd.profiler.profile(enabled=ENABLE_PROFILER,
                                             use_cuda=PROF_USE_CUDA) as prof:
            # workup
            with torch.set_grad_enabled(run_w_grad):
                predict1_t, predict2_t = model.forward(coord_t, srcpix_t,
                                                       tarpix_flow1_t,
                                                       tarpix_flow2_t,
                                                       batchsize)

        dtforward += time.time() - tforward
        print "output: flow1=", predict1_t.features.shape, " predict2_t=", predict2_t.features.shape

        if test_loss:
            tloss = time.time()
            loss, flow1loss, flow2loss = consistency_loss(
                coord_t, predict1_t, predict2_t, truth_flow1_t, truth_flow2_t)
            print "loss: tot=", loss.detach().cpu().item()
            if flow1loss is not None:
                print "      flow1=", flow1loss.detach().cpu().item()
예제 #29
0
 def __enter__(self):
     torch.set_grad_enabled(False)
예제 #30
0
def run(split, upto=None):
	torch.set_grad_enabled(split=='train')
	model.train() if split == 'train' else  model.eval()
	nsamples = 1 if split == 'train' else xte
	N, D = x.size()
	B = 128
	n_steps = N // B if upto is None else min(N//B, upto)
	losses = []
	for step in range(n_steps):
		xb = Variable(x[step * B: step * B + B])
		xbhat = torch.zeros_like(xb)
		for s in range(nsamples):
			if step % args.resample_every == 0 or split == 'test':
			model.update_masks()
			xbhat += model(xb)
		xbhat /= nsamples

		loss = F.binary_cross_entropy_with_logits(xbhat, xb, size_average=False) / B
		lossf = loss.data.item()
		losses.append(lossf)

		if split == 'train':
			opt.zero_grad()
			loss.backward()
			opt.step()

	print("%s epoch avg loss: %f" %(split, np.mean(losses)))

if __name__ == '__main__':
	parser = argparse.ArgumentParser()
    parser.add_argument('-d', '--data-path', required=True, type=str, help="Path to binarized_mnist.npz")
    parser.add_argument('-q', '--hiddens', type=str, default='500', help="Comma separated sizes for hidden layers, e.g. 500, or 500,500")
    parser.add_argument('-n', '--num-masks', type=int, default=1, help="Number of orderings for order/connection-agnostic training")
    parser.add_argument('-r', '--resample-every', type=int, default=20, help="For efficiency we can choose to resample orders/masks only once every this many steps")
    parser.add_argument('-s', '--samples', type=int, default=1, help="How many samples of connectivity/masks to average logits over during inference")
    args = parser.parse_args()

    np.random_seed(42)
    torch.manual_seed(42)
    torch.cuda.manual_seed_all(42)

    print("loading binarized mnist from", args.data_path)
    mnist = np.load(args.data_path)
    xtr, xte = mnist['train_data'], mnist['valid_data']
    xtr = torch.from_numpy(xtr).cuda()
    xte = torch.from_numpy(xte).cuda()

    # construct model and ship to GPU
    hidden_list = list(map(int, args.hiddens.split(',')))
    model = MADE(xtr.size(1), hidden_list, xtr.size(1), num_masks=args.num_masks)
    print("number of model parameters:",sum([np.prod(p.size()) for p in model.parameters()]))
    model.cuda()

    # set up the optimizer
    opt = torch.optim.Adam(model.parameters(), 1e-3, weight_decay=1e-4)
    scheduler = torch.optim.lr_scheduler.StepLR(opt, step_size=45, gamma=0.1)
    
    # start the training
    for epoch in range(100):
        print("epoch %d" % (epoch, ))
        scheduler.step(epoch)
        run_epoch('test', upto=5) # run only a few batches for approximate test accuracy
        run_epoch('train')
    
    print("optimization done. full test set eval:")
    run_epoch('test')
예제 #31
0
파일: train.py 프로젝트: hellojxt/DeepModal
def start(data_type):
    def check_grad():
        print('=========================GRAD CHECK===========================')
        for name,param in model.named_parameters():
            print(name)
            print(f'value:{param.data}')
            print(f'gradient:{param.grad}') 

    def complex_matmul(A1,B1,A2,B2):
        real_part = torch.matmul(A1,A2)-torch.matmul(B1,B2)
        imag_part = torch.matmul(A1,B2)+torch.matmul(B1,A2)
        return [real_part, imag_part]

    def forward(loader):
        total_loss = []
        for data in tqdm(loader):
            data = data.to(device)
            if data_type == 'w':
                out = model(data).view(-1,32,200)
                out = out * data.s.unsqueeze(-1)
                out_real = out[...,:100].unsqueeze(-2)
                out_imag = out[...,100:].unsqueeze(-2)
                w_real = data.w[...,:100].unsqueeze(-2)
                w_imag = data.w[...,100:].unsqueeze(-2)
                out_ = complex_matmul(out_real, out_imag, pole_matrix_real, pole_matrix_imag)
                w_ = complex_matmul(w_real, w_imag, pole_matrix_real, pole_matrix_imag)
                loss = F.l1_loss(out_[0], w_[0]) + F.l1_loss(out_[1],w_[1])

            elif data_type == 'dis':
                out = model(data)
                out = out * data.s[data.batch]
                loss = F.l1_loss(out, data.dis)

            elif data_type == 's':
                out = model(data).reshape(-1,2)
                loss = F.cross_entropy(out, data.s.reshape(-1))

            if torch.is_grad_enabled():
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()
            total_loss.append(loss.item())
        return np.mean(total_loss)

    def get_loader(phase, bz = 10):
        transforms = [RandomSample(2048)] 
        if data_type == 'dis':
            transforms += [RandomRotate(180,0),RandomRotate(180,1),RandomRotate(180,2)]
        return DataLoader(ModalDataset(args.dataset + phase, transforms = transforms),batch_size=bz,num_workers=10)

    #==========================initialize================================
    device = torch.device(f'cuda:{args.cuda}')
    if data_type == 'w':
        model = dgcnn_classification(32*200).to(device)
        optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
        scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.8)
        pole_matrix = np.load('weights/pole_matrixs.npy')
        pole_matrix = np.transpose(pole_matrix, (0,2,1))
        pole_matrix_real = torch.FloatTensor(pole_matrix.real).to(device)
        pole_matrix_imag = torch.FloatTensor(pole_matrix.imag).to(device)
    elif data_type == 'dis':
        model = dgcnn_segmentation(32).to(device)
        optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
        scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.8)
    elif data_type == 's':
        model = dgcnn_segmentation(32*2).to(device)
        optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
        scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.8)
    loader = {
        'train': get_loader('train'),
        'test' : get_loader('test')
    }
    torch.set_grad_enabled(False)
    #==========================train=====================================
    for epoch in range(200):
        model.train()
        print(f'============={epoch}=============')
        with torch.set_grad_enabled(True):
            print('train loss:{:.5f}'.format(forward(loader['train'])))
        model.eval()
        print('test loss:{:.5f}'.format(forward(loader['test'])))
        torch.save(model.state_dict(), f'weights/{data_type}_weights.pt')
        scheduler.step()
def ddpg_learner(process_ind, args,
                 global_logs,
                 learner_logs,
                 model_prototype,
                 global_memory,
                 global_model,
                 global_optimizer):
    # logs
    print("---------------------------->", process_ind, "learner")
    # env
    # memory
    # model
    local_device = torch.device('cuda:' + str(args.gpu_ind))
    # global_device = torch.device('cpu')
    # local_model = model_prototype(args.model_params,
    #                               args.state_shape,
    #                               args.action_space,
    #                               args.action_shape).to(local_device)
    local_target_model = model_prototype(args.model_params,
                                         args.norm_val,
                                         args.state_shape,
                                         args.action_space,
                                         args.action_shape).to(local_device)
    # # sync global model to local
    # local_model.load_state_dict(global_model.state_dict())
    # update_target_model(local_model, local_target_model) # do a hard update in the beginning
    update_target_model(global_model, local_target_model) # do a hard update in the beginning
    # optimizer
    local_optimizer = args.agent_params.optim(global_model.parameters(),
                                              lr=args.agent_params.lr,
                                              weight_decay=args.agent_params.weight_decay)

    # params

    # setup
    # local_model.train()
    global_model.train()
    torch.set_grad_enabled(True)

    # main control loop
    step = 0
    while global_logs.learner_step.value < args.agent_params.steps:
        if global_memory.size > args.agent_params.learn_start:
            # # sync global model to local
            # local_model.load_state_dict(global_model.state_dict())
            # sample batch from global_memory
            experiences = global_memory.sample(args.agent_params.batch_size)
            state0s, actions, rewards, gamma1s, state1s, terminal1s = experiences

            # learn on this batch - setup
            # global_optimizer.zero_grad()
            # state0s = state0s.to(local_device)
            # state1s = state1s.to(local_device)
            local_optimizer.zero_grad()
            state0s = state0s.cuda(non_blocking=True).to(local_device)
            state1s = state1s.cuda(non_blocking=True).to(local_device)

            # learn on this batch - actor loss
            # _, qvalues = local_model(state0s)
            _, qvalues = global_model(state0s)
            actor_loss = - qvalues.mean()

            # local_model.actor.zero_grad()
            actor_loss.backward()
            # nn.utils.clip_grad_value_(local_model.actor.parameters(), args.agent_params.clip_grad)
            nn.utils.clip_grad_value_(global_model.actor.parameters(), args.agent_params.clip_grad)

            # learn on this batch - critic loss
            _, target_qvalues = local_target_model(state1s)
            target_qvalues = rewards.to(local_device) + gamma1s.to(local_device) * target_qvalues.detach() * (1 - terminal1s.to(local_device))
            # predict_qvalues = local_model.forward_critic(state0s, actions.to(local_device))
            predict_qvalues = global_model.forward_critic(state0s, actions.to(local_device))
            critic_loss = args.agent_params.value_criteria(predict_qvalues, target_qvalues)

            # local_model.critic.zero_grad()
            critic_loss.backward()
            # nn.utils.clip_grad_value_(local_model.critic.parameters(), args.agent_params.clip_grad)
            nn.utils.clip_grad_value_(global_model.critic.parameters(), args.agent_params.clip_grad)

            # learn on this batch - sync local grads to global
            # ensure_global_grads(local_model, global_model, local_device, global_device)
            # global_optimizer.step()
            local_optimizer.step()

            # update target_model
            # update_target_model(local_model, local_target_model, args.agent_params.target_model_update, step)
            update_target_model(global_model, local_target_model, args.agent_params.target_model_update, step)

            # update counters
            with global_logs.learner_step.get_lock():
                global_logs.learner_step.value += 1
            step += 1

            # report stats
            if step % args.agent_params.learner_freq == 0: # then push local stats to logger & reset local
                learner_logs.actor_loss.value += actor_loss.item()
                learner_logs.critic_loss.value += critic_loss.item()
                learner_logs.loss_counter.value += 1
        else: # wait for memory_size to be larger than learn_start
            time.sleep(1)
예제 #33
0
import PIL.Image
import sys

try:
    from .correlation import correlation  # the custom cost volume layer
except:
    sys.path.insert(0, './correlation')
    import correlation  # you should consider upgrading python
# end

##########################################################

assert (int(str('').join(torch.__version__.split('.')[0:2])) >= 13
        )  # requires at least pytorch version 1.3.0

torch.set_grad_enabled(
    False)  # make sure to not compute gradients for computational performance

torch.backends.cudnn.enabled = True  # make sure to use cudnn for computational performance

##########################################################

arguments_strModel = 'css'
arguments_strFirst = './images/first.png'
arguments_strSecond = './images/second.png'
arguments_strOut = './out.flo'

for strOption, strArgument in getopt.getopt(
        sys.argv[1:], '',
    [strParameter[2:] + '=' for strParameter in sys.argv[1::2]])[0]:
    if strOption == '--model' and strArgument != '':
        arguments_strModel = strArgument  # which model to use
예제 #34
0
def trainResnet(model,
                dataloaders,
                criterion,
                optimizer,
                num_epochs=25,
                is_inception=False):
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model.to(device)
    since = time.time()

    val_acc_history = []

    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()  # Set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            # Iterate over data.
            for inputs, labels in dataloaders[phase]:
                inputs = inputs.to(device)
                labels = labels.to(device)

                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    loss = criterion(outputs, labels)

                    _, preds = torch.max(outputs, 1)

                    # backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                # statistics
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)

            epoch_loss = running_loss / len(dataloaders[phase].dataset)
            epoch_acc = running_corrects.double() / len(
                dataloaders[phase].dataset)

            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss,
                                                       epoch_acc))

            # deep copy the model
            if phase == 'val' and epoch_acc > best_acc:
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())
                fName = '%s_best_rank.pth.tar' % ('resnet_50')
                torch.save(
                    {
                        'epoch': epoch,
                        'arch': 'resnet',
                        'state_dict': best_model_wts
                    }, fName)
            if phase == 'val':
                val_acc_history.append(epoch_acc)

        print()

    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: {:4f}'.format(best_acc))

    # load best model weights
    model.load_state_dict(best_model_wts)
    return model, val_acc_history
예제 #35
0
def train(args, model, criterion, optimizer, device, train_dataloader, writer,
          epoch):
    torch.set_grad_enabled(True)
    model.train()
    running_loss = 0.0
    correct = 0
    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    losses_contrast_frame = AverageMeter()
    losses_contrast_clip = AverageMeter()
    losses_contrast = AverageMeter()
    losses_order = AverageMeter()

    end = time.time()
    torch.cuda.empty_cache()
    for i, data in enumerate(train_dataloader, 1):
        data_time.update(time.time() - end)
        # get inputs
        #tuple_clips, tuple_orders, tuple_clips_random, tuple_orders_random, index = data
        tuple_clips, tuple_orders, index = data
        bsz = tuple_clips.size(0)
        inputs = tuple_clips.to(device)
        #inputs_random = tuple_clips_random.to(device)
        targets = [order_class_index(order) for order in tuple_orders]
        targets = torch.tensor(targets).to(device)
        index = index.to(device)
        # zero the parameter gradients
        #optimizer.zero_grad()
        # forward and backward
        contrast_loss_1, contrast_loss_2, contrast_loss_3, contrast_loss_clip, outputs = model(
            inputs, tuple_orders)  # return logits here
        loss_contrast_frame = (contrast_loss_1.sum() + contrast_loss_2.sum() +
                               contrast_loss_3.sum()) / (3 * args.bs)
        loss_contrast_clip = contrast_loss_clip.sum() / args.bs
        loss_order = criterion(outputs, targets)
        loss = args.weight_contrast_frame * loss_contrast_frame + args.weight_contrast_clip * loss_contrast_clip + args.weight_order * loss_order
        #loss=args.weight_order*loss_order
        # ===================backward=====================
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # ===================meters=====================
        #losses_contrast.update(args.weight_contrast*loss_contrast.item(), bsz)
        losses_contrast_frame.update(
            args.weight_contrast_frame * loss_contrast_frame.item(), bsz)
        losses_contrast_clip.update(
            args.weight_contrast_clip * loss_contrast_clip.item(), bsz)
        losses_order.update(args.weight_order * loss_order.item(), bsz)
        losses.update(loss.item(), bsz)

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

        # compute loss and acc
        running_loss += loss.item()
        pts = torch.argmax(outputs, dim=1)
        correct += torch.sum(targets == pts).item()
        # print statistics and write summary every N batch

        # print info
        if i % 20 == 0:
            log_str = (
                'Train: [{0}/{1}][{2}/{3}]  '
                #'BT {batch_time.val:.3f} ({batch_time.avg:.3f}) '
                #'DT {data_time.val:.3f} ({data_time.avg:.3f}) '
                'loss_contrast_frame {loss_contrast_frame.val:.3f} ({loss_contrast_frame.avg:.3f}) '
                'loss_contrast_clip {loss_contrast_clip.val:.3f} ({loss_contrast_clip.avg:.3f}) '
                'loss_order {loss_order.val:.3f} ({loss_order.avg:.3f}) '
                'loss {loss.val:.3f} ({loss.avg:.3f})'.format(
                    epoch,
                    args.epochs,
                    i,
                    len(train_dataloader),
                    loss_contrast_frame=losses_contrast_frame,
                    loss_contrast_clip=losses_contrast_clip,
                    loss_order=losses_order,
                    loss=losses))
            logging.info(log_str)

        if i % args.pf == 0:
            avg_loss = running_loss / args.pf
            avg_acc = correct / (args.pf * args.bs)
            logging.info(
                '[TRAIN] epoch-{}, batch-{}, loss: {:.3f}, acc: {:.3f}'.format(
                    epoch, i, avg_loss, avg_acc))
            #step = (epoch-1)*len(train_dataloader) + i
            #writer.add_scalar('train/CrossEntropyLoss', avg_loss, step)
            #writer.add_scalar('train/Accuracy', avg_acc, step)
            running_loss = 0.0
            correct = 0
    # summary params and grads per eopch
    #for name, param in model.named_parameters():
    #    writer.add_histogram('params/{}'.format(name), param, epoch)
    #    writer.add_histogram('grads/{}'.format(name), param.grad, epoch)
    avg_loss = running_loss / len(train_dataloader)
    return avg_loss
예제 #36
0
def train_eval_model(model,
                     criterion,
                     optimizer,
                     dataloader,
                     num_epochs,
                     resume=False,
                     start_epoch=0):
    print("Start training...")

    since = time.time()
    dataloader["train"].dataset.set_num_graphs(
        cfg.TRAIN.num_graphs_in_matching_instance)
    dataset_size = len(dataloader["train"].dataset)

    device = next(model.parameters()).device
    print("model on device: {}".format(device))

    checkpoint_path = Path(cfg.model_dir) / "params"
    if not checkpoint_path.exists():
        checkpoint_path.mkdir(parents=True)

    if resume:
        params_path = os.path.join(cfg.warmstart_path, f"params.pt")
        print("Loading model parameters from {}".format(params_path))
        model.load_state_dict(torch.load(params_path))

        optim_path = os.path.join(cfg.warmstart_path, f"optim.pt")
        print("Loading optimizer state from {}".format(optim_path))
        optimizer.load_state_dict(torch.load(optim_path))

    # Evaluation only
    if cfg.evaluate_only:
        assert resume
        print(f"Evaluating without training...")
        accs, f1_scores = eval_model(model, dataloader["test"], verbose=True)
        acc_dict = {
            "acc_{}".format(cls): single_acc
            for cls, single_acc in zip(dataloader["train"].dataset.classes,
                                       accs)
        }
        f1_dict = {
            "f1_{}".format(cls): single_f1_score
            for cls, single_f1_score in zip(
                dataloader["train"].dataset.classes, f1_scores)
        }
        acc_dict.update(f1_dict)
        acc_dict["matching_accuracy"] = torch.mean(accs)
        acc_dict["f1_score"] = torch.mean(f1_scores)

        time_elapsed = time.time() - since
        print("Evaluation complete in {:.0f}h {:.0f}m {:.0f}s".format(
            time_elapsed // 3600, (time_elapsed // 60) % 60,
            time_elapsed % 60))
        return model, acc_dict

    _, lr_milestones, lr_decay = lr_schedules[cfg.TRAIN.lr_schedule]
    scheduler = optim.lr_scheduler.MultiStepLR(optimizer,
                                               milestones=lr_milestones,
                                               gamma=lr_decay)

    for epoch in range(start_epoch, num_epochs):
        print("Epoch {}/{}".format(epoch, num_epochs - 1))
        print("-" * 10)

        model.train()  # Set model to training mode

        print("lr = " + ", ".join(
            ["{:.2e}".format(x["lr"]) for x in optimizer.param_groups]))

        epoch_loss = 0.0
        running_loss = 0.0
        running_acc = 0.0
        epoch_acc = 0.0
        running_f1 = 0.0
        epoch_f1 = 0.0
        running_since = time.time()
        iter_num = 0

        # Iterate over data.
        for inputs in dataloader["train"]:
            data_list = [_.cuda() for _ in inputs["images"]]
            points_gt_list = [_.cuda() for _ in inputs["Ps"]]
            n_points_gt_list = [_.cuda() for _ in inputs["ns"]]
            edges_list = [_.to("cuda") for _ in inputs["edges"]]
            perm_mat_list = [
                perm_mat.cuda() for perm_mat in inputs["gt_perm_mat"]
            ]
            n_label_gt_list = [_.to("cuda") for _ in inputs["n_label"]]
            c_label_gt_list = [_.to("cuda") for _ in inputs["c_label"]]

            iter_num = iter_num + 1

            # zero the parameter gradients
            optimizer.zero_grad()

            with torch.set_grad_enabled(True):
                # forward
                if cfg.CLASSIFICATION.cls_type is not None:
                    s_pred_list = model(data_list, points_gt_list, edges_list,
                                        n_points_gt_list, perm_mat_list,
                                        n_label_gt_list, c_label_gt_list)
                    if cfg.CLASSIFICATION.cls_type == "class":
                        # TODO
                        pass
                    else:
                        raise NotImplementedError(
                            "No such mode in classification")
                else:
                    s_pred_list = model(data_list, points_gt_list, edges_list,
                                        n_points_gt_list, perm_mat_list)
                    loss = sum([
                        criterion(s_pred, perm_mat)
                        for s_pred, perm_mat in zip(s_pred_list, perm_mat_list)
                    ])
                    loss /= len(s_pred_list)

                # backward + optimize
                loss.backward()
                optimizer.step()

                tp, fp, fn = get_pos_neg_from_lists(s_pred_list, perm_mat_list)
                f1 = f1_score(tp, fp, fn)
                acc, _, __ = matching_accuracy_from_lists(
                    s_pred_list, perm_mat_list)

                # statistics
                bs = perm_mat_list[0].size(0)
                running_loss += loss.item() * bs  # multiply with batch size
                epoch_loss += loss.item() * bs
                running_acc += acc.item() * bs
                epoch_acc += acc.item() * bs
                running_f1 += f1.item() * bs
                epoch_f1 += f1.item() * bs

                if iter_num % cfg.STATISTIC_STEP == 0:
                    running_speed = cfg.STATISTIC_STEP * bs / (time.time() -
                                                               running_since)
                    loss_avg = running_loss / cfg.STATISTIC_STEP / bs
                    acc_avg = running_acc / cfg.STATISTIC_STEP / bs
                    f1_avg = running_f1 / cfg.STATISTIC_STEP / bs
                    print(
                        "Epoch {:<4} Iter {:<4} {:>4.2f}sample/s Loss={:<8.4f} Accuracy={:<2.3} F1={:<2.3}"
                        .format(epoch, iter_num, running_speed, loss_avg,
                                acc_avg, f1_avg))

                    running_acc = 0.0
                    running_f1 = 0.0
                    running_loss = 0.0
                    running_since = time.time()

        epoch_loss = epoch_loss / dataset_size
        epoch_acc = epoch_acc / dataset_size
        epoch_f1 = epoch_f1 / dataset_size

        if cfg.save_checkpoint:
            base_path = Path(checkpoint_path / "{:04}".format(epoch + 1))
            Path(base_path).mkdir(parents=True, exist_ok=True)
            path = str(base_path / "params.pt")
            torch.save(model.state_dict(), path)
            torch.save(optimizer.state_dict(), str(base_path / "optim.pt"))

        print(
            "Over whole epoch {:<4} -------- Loss: {:.4f} Accuracy: {:.3f} F1: {:.3f}"
            .format(epoch, epoch_loss, epoch_acc, epoch_f1))
        print()

        # Eval in each epoch
        accs, f1_scores = eval_model(model, dataloader["test"])
        acc_dict = {
            "acc_{}".format(cls): single_acc
            for cls, single_acc in zip(dataloader["train"].dataset.classes,
                                       accs)
        }
        f1_dict = {
            "f1_{}".format(cls): single_f1_score
            for cls, single_f1_score in zip(
                dataloader["train"].dataset.classes, f1_scores)
        }
        acc_dict.update(f1_dict)
        acc_dict["matching_accuracy"] = torch.mean(accs)
        acc_dict["f1_score"] = torch.mean(f1_scores)

        scheduler.step()

    time_elapsed = time.time() - since
    print("Training complete in {:.0f}h {:.0f}m {:.0f}s".format(
        time_elapsed // 3600, (time_elapsed // 60) % 60, time_elapsed % 60))

    return model, acc_dict
예제 #37
0
        pretrained_dict = torch.load(
            pretrained_path,
            map_location=lambda storage, loc: storage.cuda(device))
    if "state_dict" in pretrained_dict.keys():
        pretrained_dict = remove_prefix(pretrained_dict['state_dict'],
                                        'module.')
    else:
        pretrained_dict = remove_prefix(pretrained_dict, 'module.')
    check_keys(model, pretrained_dict)
    model.load_state_dict(pretrained_dict, strict=False)
    return model


if __name__ == '__main__':

    torch.set_grad_enabled(False)

    # net and model
    net = YuFaceDetectNet(phase='test', size=None)  # initialize detector
    net = load_model(net, args.trained_model, True)
    net.eval()

    print('Finished loading model!')

    bs = args.input_batch_size
    h = args.input_height
    w = args.input_width
    img = torch.randn(bs, 3, h, w, requires_grad=False)
    img = img.to(torch.device('cpu'))

    input_names = ['input']
예제 #38
0
파일: eval_tianchi.py 프로젝트: hukefei/STM
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import math
import time
import tqdm
import os
import argparse
import copy
import datetime

### My libs
from dataset import TIANCHI
from models.model3 import STM

torch.set_grad_enabled(False)  # Volatile


def get_arguments():
    parser = argparse.ArgumentParser(description="SST")
    parser.add_argument("-g", type=str, help="0; 0,1; 0,3; etc", required=True)
    parser.add_argument("-s", type=str, help="set", required=True)
    parser.add_argument("-viz", help="Save visualization", action="store_true")
    parser.add_argument("-D", type=str, help="path to data", default='/local/DATA')
    parser.add_argument("-M", type=str, help="path to model", default='/local/model')
    return parser.parse_args()


args = get_arguments()

GPU = args.g
예제 #39
0
파일: train.py 프로젝트: VKapicyn/DML
def train_age(kfold, batchsize, lr_age, lr_gender, num_epochs, p_augment,
              device, num_age_classes, num_gender_classes, test_fold,
              train_fold, random_seed):
    all_accuracy_age = []
    all_val_loss_age = []
    all_stat_fold = []

    for fold in range(kfold):
        all_stat = defaultdict(list)

        # image paths
        train_data = train_fold[fold]['image_path'].copy().reset_index(
            drop=True).to_list()
        test_data = test_fold[fold]['image_path'].copy().reset_index(
            drop=True).to_list()

        #get label
        train_age_label = train_fold[fold]['age'].copy().reset_index(
            drop=True).to_list()
        train_gender_label = train_fold[fold]['gender'].copy().reset_index(
            drop=True).to_list()
        test_age_label = test_fold[fold]['age'].copy().reset_index(
            drop=True).to_list()
        test_gender_label = test_fold[fold]['gender'].copy().reset_index(
            drop=True).to_list()

        #create train-validation stratified split
        sss = StratifiedShuffleSplit(n_splits=10, random_state=random_seed)

        #split based on age, more balanced for both age and gender
        train_idx, val_idx = list(sss.split(train_data, train_age_label))[0]

        train_idx = list(train_idx)
        val_idx = list(val_idx)

        #create dataloader for gender
        train_dataset = AgeDataset(
            '',
            list(np.array(train_data)[train_idx]),
            list(np.array(train_age_label)[train_idx]),
            list(np.array(train_gender_label)[train_idx]),
            p_augment=p_augment)
        val_dataset = AgeDataset('',
                                 list(np.array(train_data)[val_idx]),
                                 list(np.array(train_age_label)[val_idx]),
                                 list(np.array(train_gender_label)[val_idx]),
                                 validation=True)
        test_dataset = AgeDataset('',
                                  test_data,
                                  test_age_label,
                                  test_gender_label,
                                  validation=True)

        train_loader = DataLoader(train_dataset,
                                  batch_size=batchsize,
                                  shuffle=True)
        val_loader = DataLoader(val_dataset,
                                batch_size=batchsize,
                                shuffle=False)
        test_loader = DataLoader(test_dataset,
                                 batch_size=batchsize,
                                 shuffle=False)

        val_gender_label = list(np.array(train_gender_label)[val_idx])
        val_age_label = list(np.array(train_age_label)[val_idx])

        model = InceptionResnetV1(classify=True,
                                  pretrained='vggface2',
                                  num_classes=num_age_classes)
        model = model.to(device)

        #optimizer
        optimizer = optim.AdamW(model.parameters(), lr=lr_age)
        scheduler = optim.lr_scheduler.MultiStepLR(optimizer, [5, 10])

        #loss
        criterion = nn.CrossEntropyLoss()

        best_acc_age = 0
        best_val_loss_age = 999

        print(f'Fold {fold+1}\n')
        for epoch in range(num_epochs):
            print(f'epoch: {epoch}\n')
            train_loss_age = 0
            val_loss_age = 0

            #Training
            model.train()
            iterat = 0
            vsego = len(train_loader)
            for batch in train_loader:
                print(f'batch_num: {100*(iterat/vsego)}%\n')

                # Load image batch
                batch_data, batch_age_label = batch
                batch_data = batch_data.to(device)
                batch_age_label = batch_age_label.to(device)

                # Clear gradients
                optimizer.zero_grad()

                with torch.set_grad_enabled(True):
                    pred_age = model(batch_data)
                    loss_age = criterion(pred_age, batch_age_label)

                    train_loss_age += loss_age.detach().item()
                    loss_age.backward()
                    optimizer.step()

                iterat = iterat + 1

            #Validation
            model.eval()
            all_pred_age = torch.empty(0).to(device)
            for batch in val_loader:

                # Load image batch
                batch_data, batch_age_label = batch
                batch_data = batch_data.to(device)
                batch_age_label = batch_age_label.to(device)

                with torch.set_grad_enabled(False):
                    pred_age = model(batch_data)
                    loss_age = criterion(pred_age, batch_age_label)
                    val_loss_age += loss_age.detach().item()
                    all_pred_age = torch.cat(
                        (all_pred_age,
                         nn.functional.softmax(pred_age.detach(), dim=1)), 0)

            train_loss_age /= len(train_loader)
            val_loss_age /= len(val_loader)

            all_pred_age = all_pred_age.cpu().numpy()
            pred_label_age = list(np.argmax(all_pred_age, axis=1))

            acc_age = accuracy_score(val_age_label, pred_label_age)
            if acc_age > best_acc_age:
                best_acc_age = acc_age
                best_val_loss_age = val_loss_age
                torch.save(model.state_dict(), f'models/age_model{fold}.pth')

            all_stat['train_loss'].append(train_loss_age)
            all_stat['val_loss'].append(val_loss_age)
            all_stat['val_acc'].append(acc_age)

            print(
                f'Epoch {epoch} | train loss: {train_loss_age} | val loss: {val_loss_age} | accuracy: {round(acc_age*100, 2)}%'
            )
            scheduler.step()

        #INFERENCE
        with torch.no_grad():
            model.load_state_dict(torch.load(f'models/age_model{fold}.pth'))
            model.eval()
            test_pred_age = torch.empty(0).to(device)
            for batch in test_loader:

                # Load image batch
                batch_data, batch_age_label = batch
                batch_data = batch_data.to(device)
                batch_age_label = batch_age_label.to(device)

                with torch.set_grad_enabled(False):
                    pred_age = model(batch_data)
                    test_pred_age = torch.cat(
                        (test_pred_age,
                         nn.functional.softmax(pred_age.detach(), dim=1)), 0)

            test_pred_age = test_pred_age.cpu().numpy()
            pred_label_age = list(np.argmax(test_pred_age, axis=1))

            acc_age = accuracy_score(test_age_label, pred_label_age)
            all_stat['test_acc'].append(acc_age)
            all_stat['conf'].append(
                confusion_matrix(test_age_label,
                                 pred_label_age,
                                 labels=list(range(num_age_classes))))
            all_stat['conf_norm'].append(
                confusion_matrix(test_age_label,
                                 pred_label_age,
                                 normalize='true',
                                 labels=list(range(num_age_classes))))
            all_stat['test_pred'].append(pred_label_age)
            all_stat['test_target'].append(test_age_label)

        all_accuracy_age.append(acc_age)
        all_val_loss_age.append(best_val_loss_age)
        print(
            f'TEST ACCURACY: {round(acc_age*100,2)}% | Val. Accuracy: {round(best_acc_age*100,2)}% | Val. Loss.: {best_val_loss_age}\n'
        )

        all_stat_fold.append(all_stat)

    all_accuracy_age = np.array(all_accuracy_age)
    all_val_loss_age = np.array(all_val_loss_age)

    mean_accuracy_age = round(all_accuracy_age.mean() * 100, 2)

    print(f'\nOverall Accuracy: {mean_accuracy_age} p/m')
예제 #40
0
def trans_from_files_beam(trans_source, trans_target, train_source, train_target,
                          embedding_params, encdec_params, seed=3, beam_size=10, use_attenMatrix=False):
    batchSize = 1
    beamSize = beam_size
    print('trans_source :' + trans_source)
    print('train_source :' + train_source)
    print('train_target :' + train_target)
    print('embedding_params :' + embedding_params)
    print('encdec_params :' + encdec_params)

    corpus = Corpus(train_source, train_source, train_target, trans_source,
                    trans_source, trans_target, minFreqSource, minFreqTarget, maxLen)

    print('Source vocabulary size: ' + str(corpus.sourceVoc.size()))
    print('Target vocabulary size: ' + str(corpus.targetVoc.size()))
    print('# of training samples: ' + str(len(corpus.trainData)))
    print('# of develop samples:  ' + str(len(corpus.devData)))
    print('SEED: ', str(seed))

    embedding = Embedding(sourceEmbedDim, targetEmbedDim,
                          corpus.sourceVoc.size(), corpus.targetVoc.size())
    encdec = EncDec(sourceEmbedDim, targetEmbedDim, hiddenDim,
                    corpus.targetVoc.size(), dropoutRate=dropoutRate, numLayers=numLayers)

    encdec.wordPredictor.softmaxLayer.weight = embedding.targetEmbedding.weight
    encdec.wordPredictor = nn.DataParallel(encdec.wordPredictor, gpuId)

    batchListTrain = utils.buildBatchList(len(corpus.trainData), batchSize)
    batchListDev = utils.buildBatchList(len(corpus.devData), batchSize)

    withoutWeightDecay = []
    withWeightDecay = []
    for name, param in list(embedding.named_parameters()) + list(encdec.named_parameters()):
        if 'bias' in name or 'Embedding' in name:
            withoutWeightDecay += [param]
        elif 'softmax' not in name:
            withWeightDecay += [param]
    optParams = [{'params': withWeightDecay, 'weight_decay': weightDecay},
                 {'params': withoutWeightDecay, 'weight_decay': 0.0}]
    totalParamsNMT = withoutWeightDecay + withWeightDecay

    opt = optim.SGD(optParams, momentum=momentumRate, lr=learningRate)

    bestDevGleu = -1.0
    prevDevGleu = -1.0

    torch.set_grad_enabled(False)

    embedding.load_state_dict(torch.load(embedding_params))
    encdec.load_state_dict(torch.load(encdec_params))

    embedding.to(device)
    encdec.to(device)

    embedding.eval()
    encdec.eval()

    f_trans = open('./trans.txt', 'w')
    f_gold = open('./gold.txt', 'w')
    f_attn = open('./attn.txt', 'w')

    devPerp = 0.0
    totalTokenCount = 0.0

    attention_scores_matrix_list = []
    trans_result = []

    for batch in tqdm(batchListDev):
        batchSize = batch[1] - batch[0] + 1

        batchInputSource, lengthsSource, batchInputTarget, batchTarget, lengthsTarget, tokenCount, batchData = corpus.processBatchInfoNMT(
            batch, train=False, device=device)

        inputSource = embedding.getBatchedSourceEmbedding(batchInputSource)
        sourceH, (hn, cn) = encdec.encode(inputSource, lengthsSource)

        if beamSize == 1:
            indicesGreedy, lengthsGreedy, attentionIndices = encdec.greedyTrans(
                corpus.targetVoc.bosIndex, corpus.targetVoc.eosIndex, lengthsSource, embedding.targetEmbedding, sourceH, (hn, cn), device, maxGenLen=maxLen)
        else:
            if use_attenMatrix == True:
                indicesGreedy, lengthsGreedy, attentionIndices, attenMatrix = encdec.beamSearchAttn(
                    corpus.targetVoc.bosIndex, corpus.targetVoc.eosIndex, lengthsSource, embedding.targetEmbedding, sourceH, (hn, cn), device, beamSize=beamSize, maxGenLen=maxLen)
                attention_scores_matrix_list.append(attenMatrix)
            else:
                indicesGreedy, lengthsGreedy, attentionIndices = encdec.beamSearch(
                    corpus.targetVoc.bosIndex, corpus.targetVoc.eosIndex, lengthsSource, embedding.targetEmbedding, sourceH, (hn, cn), device, beamSize=beamSize, maxGenLen=maxLen)
        indicesGreedy = indicesGreedy.to(cpu)

        for i in range(batchSize):
            target_tokens = []
            for k in range(lengthsGreedy[i] - 1):
                index = indicesGreedy[i, k].item()
                if index == corpus.targetVoc.unkIndex:
                    index = attentionIndices[i, k].item()
                    target_tokens.append(
                        batchData[i].sourceOrigStr[index] + ' ')
                    f_trans.write(batchData[i].sourceOrigStr[index] + ' ')
                else:
                    f_trans.write(corpus.targetVoc.tokenList[index].str + ' ')
                    target_tokens.append(
                        corpus.targetVoc.tokenList[index].str + ' ')

            trans_result.append(" ".join(target_tokens))
            f_trans.write('\n')

            for k in range(lengthsTarget[i] - 1):
                index = batchInputTarget[i, k + 1].item()
                if index == corpus.targetVoc.unkIndex:
                    f_gold.write(batchData[i].targetUnkMap[k] + ' ')
                else:
                    f_gold.write(corpus.targetVoc.tokenList[index].str + ' ')
            f_gold.write('\n')

            # This is code to save attention max index.
            for k in range(lengthsGreedy[i] - 1):
                f_attn.write(str(attentionIndices[i, k].item()) + ' ')
            f_attn.write('\n')

        batchInputTarget = batchInputTarget.to(device)
        batchTarget = batchTarget.to(device)
        inputTarget = embedding.getBatchedTargetEmbedding(batchInputTarget)

        loss = encdec(inputTarget, lengthsTarget, lengthsSource,
                      (hn, cn), sourceH, batchTarget)
        loss = loss.sum()
        devPerp += loss.item()

        totalTokenCount += tokenCount

    f_trans.close()
    f_gold.close()
    f_attn.close()

    if use_attenMatrix == True:
        return trans_result, attention_scores_matrix_list
예제 #41
0
 def __enter__(self):
     torch.set_grad_enabled(True)
예제 #42
0
def main():
    # os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu
    assert torch.cuda.is_available(), "Currently, we only support CUDA version"

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    torch.cuda.set_device(device)
    torch.manual_seed(args.seed)
    torch.cuda.manual_seed(args.seed)
    random.seed(args.seed)
    np.random.seed(args.seed)

    Network = getattr(models, args.net)  #
    model = Network(**args.net_params)
    model = torch.nn.DataParallel(model).to(device)

    optimizer = getattr(torch.optim, args.opt)(model.parameters(), **args.opt_params)
    criterion = getattr(criterions, args.criterion)

    msg = ''
    if args.resume:
        if os.path.isfile(args.resume):
            try:
                print("=> loading checkpoint '{}'".format(args.resume))
                checkpoint = torch.load(args.resume)
                print('Loaded checkpoint')
                args.start_iter = checkpoint['iter']
                print('Applying to model')
                model.load_state_dict(checkpoint['state_dict'])
                print('Applied to model')
                if not args.finetune:
                    optimizer.load_state_dict(checkpoint['optim_dict'])
                msg = ("=> loaded checkpoint '{}' (iter {})".format(args.resume, checkpoint['iter']))
            except:
                print("Raise EXCEPT: could not load checkpoint")
        else:
            msg = "=> no checkpoint found at '{}'".format(args.resume)
    else:
        msg = '-------------- New training session ----------------'

    msg += '\n' + str(args)
    logging.info(msg)

    # Data loading code
    Dataset = getattr(datasets, args.dataset)  #

    if args.prefix_path:
        args.train_data_dir = os.path.join(args.prefix_path, args.train_data_dir)
    train_list = os.path.join(args.train_data_dir, args.train_list)
    train_set = Dataset(train_list, root=args.train_data_dir, for_train=True, transforms=args.train_transforms)

    num_iters = args.num_iters or (len(train_set) * args.num_epochs) // args.batch_size
    num_iters -= args.start_iter
    train_sampler = CycleSampler(len(train_set), num_iters * args.batch_size)
    train_loader = DataLoader(
        dataset=train_set,
        batch_size=args.batch_size,
        collate_fn=train_set.collate,
        sampler=train_sampler,
        num_workers=args.workers,
        pin_memory=True,
        worker_init_fn=init_fn)

    start = time.time()

    enum_batches = len(train_set) / float(args.batch_size)  # nums_batch per epoch

    losses = AverageMeter()
    torch.set_grad_enabled(True)

    for i, data in enumerate(train_loader, args.start_iter):

        elapsed_bsize = int(i / enum_batches) + 1
        epoch = int((i + 1) / enum_batches)
        setproctitle.setproctitle("Epoch:{}/{}".format(elapsed_bsize, args.num_epochs))

        # actual training
        adjust_learning_rate(optimizer, epoch, args.num_epochs, args.opt_params.lr)

        data = [t.cuda(non_blocking=True) for t in data]
        x, target = data[:2]

        output = model(x)

        if not args.weight_type:  # compatible for the old version
            args.weight_type = 'square'

        if args.criterion_kwargs is not None:
            loss = criterion(output, target, **args.criterion_kwargs)
        else:
            loss = criterion(output, target)

        # measure accuracy and record loss
        losses.update(loss.item(), target.numel())

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

        if (i + 1) % int(enum_batches * args.save_freq) == 0 \
                or (i + 1) % int(enum_batches * (args.num_epochs - 1)) == 0 \
                or (i + 1) % int(enum_batches * (args.num_epochs - 2)) == 0 \
                or (i + 1) % int(enum_batches * (args.num_epochs - 3)) == 0 \
                or (i + 1) % int(enum_batches * (args.num_epochs - 4)) == 0:
            file_name = os.path.join(ckpts, 'model_epoch_{}.pth'.format(epoch))
            epoch_checkpoint = {
                'iter': i,
                'state_dict': model.state_dict(),
                'optim_dict': optimizer.state_dict(),
            }
            torch.save(epoch_checkpoint, file_name)

            if args.aws:
                torch.save(epoch_checkpoint, os.path.join('/opt/ml/checkpoints', 'model_epoch_{}.pth'.format(epoch)))

            # TODO: need to save to /opt/ml/checkpoints

        msg = 'Iter {0:}, Epoch {1:.4f}, Loss {2:.7f}'.format(i + 1, (i + 1) / enum_batches, losses.avg)
        logging.info(msg)

        losses.reset()

    i = num_iters + args.start_iter
    file_name = os.path.join(ckpts, 'model_last.pth')
    torch.save({
        'iter': i,
        'state_dict': model.state_dict(),
        'optim_dict': optimizer.state_dict(),
    },
        file_name)

    msg = 'total time: {:.4f} minutes'.format((time.time() - start) / 60)
    logging.info(msg)
예제 #43
0
def main():
    logger.info('------------MODEL TEST INPUT--------------')
    logger.info('loading config file...')
    global_config = read_config()

    # set random seed
    seed = global_config['global']['random_seed']
    torch.manual_seed(seed)

    torch.set_grad_enabled(False)  # make sure all tensors below have require_grad=False

    logger.info('reading squad dataset...')
    dataset = SquadDataset(global_config)

    logger.info('constructing model...')
    model_choose = global_config['global']['model']
    dataset_h5_path = global_config['data']['dataset_h5']
    if model_choose == 'base':
        model = BaseModel(dataset_h5_path,
                          model_config=read_config('config/base_model.yaml'))
    elif model_choose == 'match-lstm':
        model = MatchLSTM(dataset_h5_path)
    elif model_choose == 'match-lstm+':
        model = MatchLSTMPlus(dataset_h5_path)
    elif model_choose == 'r-net':
        model = RNet(dataset_h5_path)
    elif model_choose == 'm-reader':
        model = MReader(dataset_h5_path)
    else:
        raise ValueError('model "%s" in config file not recoginized' % model_choose)

    model.eval()  # let training = False, make sure right dropout
    logging.info('model parameters count: %d' % count_parameters(model))

    # load model weight
    logger.info('loading model weight...')
    model_weight_path = global_config['data']['model_path']
    is_exist_model_weight = os.path.exists(model_weight_path)
    assert is_exist_model_weight, "not found model weight file on '%s'" % model_weight_path

    weight = torch.load(model_weight_path, map_location=lambda storage, loc: storage)
    model.load_state_dict(weight, strict=False)

    # manual input qa
    context = "In 1870, Tesla moved to Karlovac, to attend school at the Higher Real Gymnasium, where he was " \
             "profoundly influenced by a math teacher Martin Sekuli\u0107.:32 The classes were held in German, " \
             "as it was a school within the Austro-Hungarian Military Frontier. Tesla was able to perform integral " \
             "calculus in his head, which prompted his teachers to believe that he was cheating. He finished a " \
             "four-year term in three years, graduating in 1873.:33 "
    question1 = "What language were classes held in at Tesla's school?"
    answer1 = ["German"]

    question2 = "Who was Tesla influenced by while in school?"
    answer2 = ["Martin Sekuli\u0107"]

    question3 = "Why did Tesla go to Karlovac?"
    answer3 = ["attend school at the Higher Real Gymnasium", 'to attend school']

    # change here to select questions
    question = question1
    answer = answer1[0]

    # preprocess
    nlp = spacy.load('en')
    context_doc = DocText(nlp, context, global_config['preprocess'])
    question_doc = DocText(nlp, question, global_config['preprocess'])
    context_doc.update_em(question_doc)
    question_doc.update_em(context_doc)

    context_token = context_doc.token
    question_token = question_doc.token

    context_id_char = to_long_tensor(dataset.sentence_char2id(context_token))
    question_id_char = to_long_tensor(dataset.sentence_char2id(question_token))

    context_id, context_f = context_doc.to_id(dataset.meta_data)
    question_id, question_f = question_doc.to_id(dataset.meta_data)

    bat_input = [context_id, question_id, context_id_char, question_id_char, context_f, question_f]
    bat_input = [x.unsqueeze(0) if x is not None else x for x in bat_input]

    out_ans_prop, out_ans_range, vis_param = model.forward(*bat_input)
    out_ans_range = out_ans_range.numpy()

    start = out_ans_range[0][0]
    end = out_ans_range[0][1] + 1

    out_answer_id = context_id[start:end]
    out_answer = dataset.sentence_id2word(out_answer_id)

    logging.info('Predict Answer: ' + ' '.join(out_answer))

    # to show on visdom
    s = 0
    e = 48

    x_left = vis_param['match']['left']['alpha'][0, :, s:e].numpy()
    x_right = vis_param['match']['right']['alpha'][0, :, s:e].numpy()

    x_left_gated = vis_param['match']['left']['gated'][0, :, s:e].numpy()
    x_right_gated = vis_param['match']['right']['gated'][0, :, s:e].numpy()

    draw_heatmap_sea(x_left,
                     xlabels=context_token[s:e],
                     ylabels=question_token,
                     answer=answer,
                     save_path='data/test-left.png',
                     bottom=0.45)
    draw_heatmap_sea(x_right,
                     xlabels=context_token[s:e],
                     ylabels=question_token,
                     answer=answer,
                     save_path='data/test-right.png',
                     bottom=0.45)

    enable_self_match = False
    if enable_self_match:
        x_self_left = vis_param['self']['left']['alpha'][0, s:e, s:e].numpy()
        x_self_right = vis_param['self']['right']['alpha'][0, s:e, s:e].numpy()

        draw_heatmap_sea(x_self_left,
                         xlabels=context_token[s:e],
                         ylabels=context_token[s:e],
                         answer=answer,
                         save_path='data/test-self-left.png',
                         inches=(11, 11),
                         bottom=0.2)
        draw_heatmap_sea(x_self_right,
                         xlabels=context_token[s:e],
                         ylabels=context_token[s:e],
                         answer=answer,
                         save_path='data/test-self-right.png',
                         inches=(11, 11),
                         bottom=0.2)
예제 #44
0
def train_helper(model: torchvision.models.resnet.ResNet,
                 dataloaders: Dict[str, torch.utils.data.DataLoader],
                 dataset_sizes: Dict[str,
                                     int], criterion: torch.nn.modules.loss,
                 optimizer: torch.optim, scheduler: torch.optim.lr_scheduler,
                 num_epochs: int, writer: IO, device: torch.device,
                 start_epoch: int, batch_size: int, save_interval: int,
                 checkpoints_folder: Path, num_layers: int, classes: List[str],
                 num_classes: int) -> None:
    """
    Function for training ResNet.

    Args:
        model: ResNet model for training.
        dataloaders: Dataloaders for IO pipeline.
        dataset_sizes: Sizes of the training and validation dataset.
        criterion: Metric used for calculating loss.
        optimizer: Optimizer to use for gradient descent.
        scheduler: Scheduler to use for learning rate decay.
        start_epoch: Starting epoch for training.
        writer: Writer to write logging information.
        device: Device to use for running model.
        num_epochs: Total number of epochs to train for.
        batch_size: Mini-batch size to use for training.
        save_interval: Number of epochs between saving checkpoints.
        checkpoints_folder: Directory to save model checkpoints to.
        num_layers: Number of layers to use in the ResNet model from [18, 34, 50, 101, 152].
        classes: Names of the classes in the dataset.
        num_classes: Number of classes in the dataset.
    """
    since = time.time()

    # Initialize all the tensors to be used in training and validation.
    # Do this outside the loop since it will be written over entirely at each
    # epoch and doesn't need to be reallocated each time.
    train_all_labels = torch.empty(size=(dataset_sizes["train"], ),
                                   dtype=torch.long).cpu()
    train_all_predicts = torch.empty(size=(dataset_sizes["train"], ),
                                     dtype=torch.long).cpu()
    val_all_labels = torch.empty(size=(dataset_sizes["val"], ),
                                 dtype=torch.long).cpu()
    val_all_predicts = torch.empty(size=(dataset_sizes["val"], ),
                                   dtype=torch.long).cpu()

    # Train for specified number of epochs.
    for epoch in range(start_epoch, num_epochs):

        # Training phase.
        model.train(mode=True)

        train_running_loss = 0.0
        train_running_corrects = 0

        # Train over all training data.
        for idx, (inputs, labels) in enumerate(dataloaders["train"]):
            train_inputs = inputs.to(device=device)
            train_labels = labels.to(device=device)
            optimizer.zero_grad()

            # Forward and backpropagation.
            with torch.set_grad_enabled(mode=True):
                train_outputs = model(train_inputs)
                __, train_preds = torch.max(train_outputs, dim=1)
                train_loss = criterion(input=train_outputs,
                                       target=train_labels)
                train_loss.backward()
                optimizer.step()

            # Update training diagnostics.
            train_running_loss += train_loss.item() * train_inputs.size(0)
            train_running_corrects += torch.sum(
                train_preds == train_labels.data, dtype=torch.double)

            start = idx * batch_size
            end = start + batch_size

            train_all_labels[start:end] = train_labels.detach().cpu()
            train_all_predicts[start:end] = train_preds.detach().cpu()

        calculate_confusion_matrix(all_labels=train_all_labels.numpy(),
                                   all_predicts=train_all_predicts.numpy(),
                                   classes=classes,
                                   num_classes=num_classes)

        # Store training diagnostics.
        train_loss = train_running_loss / dataset_sizes["train"]
        train_acc = train_running_corrects / dataset_sizes["train"]

        if torch.cuda.is_available():
            torch.cuda.empty_cache()

        # Validation phase.
        model.train(mode=False)

        val_running_loss = 0.0
        val_running_corrects = 0

        # Feed forward over all the validation data.
        for idx, (val_inputs, val_labels) in enumerate(dataloaders["val"]):
            val_inputs = val_inputs.to(device=device)
            val_labels = val_labels.to(device=device)

            # Feed forward.
            with torch.set_grad_enabled(mode=False):
                val_outputs = model(val_inputs)
                _, val_preds = torch.max(val_outputs, dim=1)
                val_loss = criterion(input=val_outputs, target=val_labels)

            # Update validation diagnostics.
            val_running_loss += val_loss.item() * val_inputs.size(0)
            val_running_corrects += torch.sum(val_preds == val_labels.data,
                                              dtype=torch.double)

            start = idx * batch_size
            end = start + batch_size

            val_all_labels[start:end] = val_labels.detach().cpu()
            val_all_predicts[start:end] = val_preds.detach().cpu()

        calculate_confusion_matrix(all_labels=val_all_labels.numpy(),
                                   all_predicts=val_all_predicts.numpy(),
                                   classes=classes,
                                   num_classes=num_classes)

        # Store validation diagnostics.
        val_loss = val_running_loss / dataset_sizes["val"]
        val_acc = val_running_corrects / dataset_sizes["val"]

        if torch.cuda.is_available():
            torch.cuda.empty_cache()

        scheduler.step()

        current_lr = None
        for group in optimizer.param_groups:
            current_lr = group["lr"]

        # Remaining things related to training.
        if epoch % save_interval == 0:
            epoch_output_path = checkpoints_folder.joinpath(
                f"resnet{num_layers}_e{epoch}_va{val_acc:.5f}.pt")

            # Confirm the output directory exists.
            epoch_output_path.parent.mkdir(parents=True, exist_ok=True)

            # Save the model as a state dictionary.
            torch.save(obj={
                "model_state_dict": model.state_dict(),
                "optimizer_state_dict": optimizer.state_dict(),
                "scheduler_state_dict": scheduler.state_dict(),
                "epoch": epoch + 1
            },
                       f=str(epoch_output_path))

        writer.write(f"{epoch},{train_loss:.4f},"
                     f"{train_acc:.4f},{val_loss:.4f},{val_acc:.4f}\n")

        # Print the diagnostics for each epoch.
        print(f"Epoch {epoch} with lr "
              f"{current_lr:.15f}: "
              f"t_loss: {train_loss:.4f} "
              f"t_acc: {train_acc:.4f} "
              f"v_loss: {val_loss:.4f} "
              f"v_acc: {val_acc:.4f}\n")

    # Print training information at the end.
    print(f"\ntraining complete in "
          f"{(time.time() - since) // 60:.2f} minutes")
예제 #45
0
 def __exit__(self, *args):
     torch.set_grad_enabled(self.prev)
     return False
예제 #46
0
    def train(self, filename):
        best_accuracy = []
        for i in range(self.net_count):
            self.nets[i] = self.nets[i].to(self.device)
            best_accuracy.append(0)
        starttime = int(time.time())

        input_size = 120

        with open(REPLAYS_FOLDER + "/model_training_" + filename +
                  str(starttime) + ".csv",
                  'a',
                  newline='') as csvfile:
            headers = ['epoch', 'loss', 'avg_validation_accuracy']
            headers.extend(self.dataset_labels)
            writer = csv.DictWriter(csvfile, fieldnames=headers, delimiter=',')
            writer.writeheader()

            for epoch in range(self.max_epochs):
                # Reshuffle the indexes in the training batch to ensure the net does not memories the order of data being fed in
                np.random.shuffle(self.train_indecis)
                train_sampler = SubsetRandomSampler(self.train_indecis)
                self.train_loader = torch.utils.data.DataLoader(
                    self.dataset,
                    batch_size=self.batch_size,
                    sampler=train_sampler)

                # Training
                #self.dataset.set_training(True)
                epoch_loss = 0.0
                running_loss = []
                for j in range(self.net_count):
                    running_loss.append(0.0)
                    self.nets[j].train(True)
                i = 0
                with torch.set_grad_enabled(True):
                    for local_batch, local_labels in self.train_loader:
                        # Transfer to GPU
                        local_batch, local_labels = local_batch.to(
                            self.device), local_labels.to(self.device)

                        # Zero the gradients for this batch
                        i += 1
                        for j in range(self.net_count):
                            net = self.nets[j]
                            optimizer = self.optimizers[j]
                            optimizer.zero_grad()

                            # Calculating loss
                            output = net(local_batch)
                            loss = self.criterion(output, local_labels)
                            loss.backward()

                            # Prevent exploding weights
                            torch.nn.utils.clip_grad_norm_(net.parameters(), 4)
                            optimizer.step()

                            running_loss[j] += loss.item()
                            epoch_loss += output.shape[0] * loss.item()

                            if (i % 10 == 0):
                                correct_in_minibatch = (
                                    local_labels == output.max(
                                        dim=1)[1]).sum()
                                print(
                                    '[Net: %d, %d, %5d] loss: %.3f acc: %.3f' %
                                    (j + 1, epoch + 1, i + 1,
                                     (running_loss[j] / 10),
                                     correct_in_minibatch.item() /
                                     self.batch_size))
                                running_loss[j] = 0.0

                epoch_loss = epoch_loss / (self.dataset_size *
                                           (1 - self.validation_split))
                print('Training loss: {:.4f}'.format(epoch_loss))
                print("Validating...")
                for j in range(self.net_count):
                    self.nets[j].train(False)

                # Validation
                #self.dataset.set_training(False)
                epoch_validation_loss = []
                correct = []
                epoch_loss = []
                accuracy = []
                for j in range(self.net_count):
                    epoch_validation_loss.append(0.0)
                    correct.append(0)

                with torch.set_grad_enabled(False):
                    accuracy_batch = {
                        'total': {},
                        'correct': {},
                        'percent': {}
                    }
                    for dataset_label in self.dataset_labels:
                        accuracy_batch['total'][dataset_label] = 0
                        accuracy_batch['correct'][dataset_label] = 0
                        accuracy_batch['percent'][dataset_label] = 0

                    for local_batch, local_labels in self.validation_loader:
                        # Transfer to GPU
                        local_batch, local_labels = local_batch.to(
                            self.device), local_labels.to(self.device)

                        # Zero the gradients for this batch
                        for j in range(self.net_count):
                            optimizer = self.optimizers[j]
                            net = self.nets[j]
                            optimizer.zero_grad()

                            # Calculating loss
                            output = net(local_batch)
                            correct[j] += (local_labels == output.max(
                                dim=1)[1]).sum().item()
                            loss = self.criterion(output, local_labels)
                            epoch_validation_loss[
                                j] += output.shape[0] * loss.item()

                            # Calculate the percentages
                            for index, label in enumerate(local_labels):
                                local_label_string = self.dataset_labels[label]
                                accuracy_batch['total'][
                                    local_label_string] += 1
                                if (output[index].argmax() == label):
                                    accuracy_batch['correct'][
                                        local_label_string] += 1
                                accuracy_batch['percent'][
                                    local_label_string] = accuracy_batch[
                                        'correct'][
                                            local_label_string] / accuracy_batch[
                                                'total'][local_label_string]

                for j in range(self.net_count):
                    epoch_loss.append(
                        epoch_validation_loss[j] /
                        (self.dataset_size * self.validation_split))
                    accuracy.append(
                        correct[j] /
                        (self.dataset_size * self.validation_split))
                    print('[Net: %d] Validation loss: %.4f accuracy %.3f' %
                          (j + 1, epoch_loss[j], accuracy[j]))

                print(
                    '[Combined] Sum validation loss: %.4f average accuracy %.3f'
                    % (np.sum(epoch_loss), np.average(accuracy)))
                csv_row = {
                    'epoch': epoch,
                    'loss': np.sum(epoch_loss),
                    'avg_validation_accuracy': np.average(accuracy)
                }
                for dataset_label in self.dataset_labels:
                    csv_row[dataset_label] = accuracy_batch['percent'][
                        dataset_label]
                writer.writerow(csv_row)
                csvfile.flush()

                for j in range(self.net_count):
                    current_filename = filename + '_' + str(j + 1)
                    if (accuracy[j] > best_accuracy[j]):
                        best_accuracy[j] = accuracy[j]
                        current_filename = filename + '_' + str(j +
                                                                1) + '-BEST'

                    torch.save(
                        {
                            'state_dict': self.nets[j].state_dict(),
                            'input_size': self.input_size,
                            'labels': self.dataset_labels,
                            'accuracy': accuracy[j],
                            'last_row': csv_row,
                            'loss': epoch_loss[j],
                            'epoch': epoch
                        },
                        os.path.join(CLASSIFIER_FOLDER, current_filename) +
                        '-weights.pth.tar')
def train_model(image_datasets, arch='vgg19', hidden_units=4096, epochs=25, learning_rate=0.001, gpu=False, checkpoint=''):
    # Use command line values when specified
    if args.arch:
        arch = args.arch     
        
    if args.hidden_units:
        hidden_units = args.hidden_units

    if args.epochs:
        epochs = args.epochs
            
    if args.learning_rate:
        learning_rate = args.learning_rate

    if args.gpu:
        gpu = args.gpu

    if args.checkpoint:
        checkpoint = args.checkpoint        
        
    # Using the image datasets, define the dataloaders
    dataloaders = {
        x: data.DataLoader(image_datasets[x], batch_size=4, shuffle=True, num_workers=2)
        for x in list(image_datasets.keys())
    }
 
    # Calculate dataset sizes.
    dataset_sizes = {
        x: len(dataloaders[x].dataset) 
        for x in list(image_datasets.keys())
    }    

        
    print('Network architecture:', arch)
    print('Number of hidden units:', hidden_units)
    print('Number of epochs:', epochs)
    print('Learning rate:', learning_rate)

    # Load the model     
    num_labels = len(image_datasets['train'].classes)
    model = load_model(arch=arch, num_labels=num_labels, hidden_units=hidden_units)

    # Use gpu if selected and available
    if gpu and torch.cuda.is_available():
        print('Using GPU for training')
        device = torch.device("cuda:0")
        model.cuda()
    else:
        print('Using CPU for training')
        device = torch.device("cpu")     

                
    # Defining criterion, optimizer and scheduler
    # Observe that only parameters that require gradients are optimized
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(list(filter(lambda p: p.requires_grad, model.parameters())), lr=learning_rate, momentum=0.9)
    scheduler = lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)    
        
    since = time.time()

    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    for epoch in range(epochs):
        print('Epoch {}/{}'.format(epoch + 1, epochs))
        print('-' * 10)

        # Each epoch has a training and validation phase
        for phase in ['train', 'valid']:
            if phase == 'train':
                scheduler.step()
                model.train()  # Set model to training mode
            else:
                model.eval()   # Set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            # Iterate over data.
            for inputs, labels in dataloaders[phase]:                
                inputs = inputs.to(device)
                labels = labels.to(device)
                

                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    _, preds = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)

                    # backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                # statistics
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)

            epoch_loss = running_loss / dataset_sizes[phase]
            epoch_acc = running_corrects.double() / dataset_sizes[phase]

            print('{} Loss: {:.4f} Acc: {:.4f}'.format(
                phase, epoch_loss, epoch_acc))

            # deep copy the model
            if phase == 'valid' and epoch_acc > best_acc:
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())

        print()

    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: {:4f}'.format(best_acc))

    # Load best model weights
    model.load_state_dict(best_model_wts)
    
    # Store class_to_idx into a model property
    model.class_to_idx = image_datasets['train'].class_to_idx
    
    # Save checkpoint if requested
    if checkpoint:
        print ('Saving checkpoint to:', checkpoint) 
        checkpoint_dict = {
            'arch': arch,
            'class_to_idx': model.class_to_idx, 
            'state_dict': model.state_dict(),
            'hidden_units': hidden_units
        }
        
        torch.save(checkpoint_dict, checkpoint)
    
    # Return the model
    return model
예제 #48
0
def train(train_loader, model, criterion, optimizer, epoch, use_cuda):
    # switch to train mode
    model.train()
    torch.set_grad_enabled(True)

    batch_time = AverageMeter()
    data_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top5 = AverageMeter()
    end = time.time()

    bar = Bar('Processing', max=len(train_loader))
    show_step = len(train_loader) // 10
    for batch_idx, (inputs, targets) in enumerate(train_loader):
        batch_size = inputs.size(0)
        if batch_size < args.train_batch:
            continue
        # measure data loading time
        data_time.update(time.time() - end)

        if use_cuda:
            inputs, targets = inputs.cuda(), targets.cuda(async=True)
        inputs, targets = torch.autograd.Variable(
            inputs), torch.autograd.Variable(targets)

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

        # measure accuracy and record loss
        prec1, prec5 = accuracy(outputs.data, targets.data, topk=(1, 5))
        losses.update(loss.data, inputs.size(0))
        top1.update(prec1, inputs.size(0))
        top5.update(prec5, inputs.size(0))

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

        # measure elapsed time
        batch_time.update(time.time() - end)
        end = time.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(train_loader),
            data=data_time.val,
            bt=batch_time.val,
            total=bar.elapsed_td,
            eta=bar.eta_td,
            loss=losses.avg,
            top1=top1.avg,
            top5=top5.avg,
        )
        if (batch_idx) % show_step == 0:
            print(bar.suffix)
        bar.next()
    bar.finish()
    return (losses.avg, top1.avg)
예제 #49
0
def main(args):
    print(args)
    CLASSES = args.classes
    categories = []
    iid = 0
    for i in args.classes:
        iid += 1
        item = {'category': i, 'id': iid, 'name': i, 'supercategory': 'Litter'}
        categories.append(item)

    if args.dst_img is not None and not os.path.exists(args.dst_img):
        os.mkdir(args.dst_img)
    num_classes = len(CLASSES)
    torch.set_grad_enabled(False)
    model = args.checkpoint.split('-')[-1].split('/')[0]
    bench = set_model(model, num_classes, args.checkpoint, args.device)

    bench.eval()

    annotations = {}
    annotations['info'] = {
        'contributor':
        'WiML&DS, Detect Waste in Pomerania',
        'date_created':
        '12.02.2021',
        'description':
        'Detect waste is a non-profit, educational, '
        'eco project that aims to use Artificial '
        'Intelligence for the general good. '
        'We have gathered a team of ten carefully selected '
        'members and five mentors to work together on the '
        'problem of the world’s waste pollution.',
        'url':
        'detectwaste.ml',
        'version':
        'v1',
        'year':
        '2021'
    }
    annotations['licenses'] = [{
        'id':
        0,
        'name':
        'Attribution-NonCommercial 4.0 International',
        'url':
        'https://creativecommons.org/licenses/by-nc/4.0/legalcode'
    }]
    annotations['categories'] = categories
    annotations['images'] = []
    img_id = 0
    annotations['annotations'] = []
    ann_id = 0
    for fname in tqdm(os.listdir(args.src_img)):
        img_name = os.path.join(args.src_img, fname)
        # read an image and add it to annotations
        try:
            im = Image.open(img_name).convert('RGB')
            w, h = im.size
            img_item = {
                'file_name': fname,
                'height': h,
                'id': img_id,
                'width': w
            }
            annotations['images'].append(img_item)
        except:
            print(f"Error with {img_name}")
            continue

        # mean-std normalize the input image (batch-size: 1)
        img = get_transforms(im)

        # propagate through the model
        outputs = bench(img.to(args.device))

        # keep only predictions above set confidence
        bboxes_keep = outputs[0, outputs[0, :, 4] > args.prob_threshold]
        probas = bboxes_keep[:, 4:]

        # convert boxes to image scales
        bboxes_scaled = rescale_bboxes(bboxes_keep[:, :4], im.size,
                                       tuple(img.size()[2:]))

        # plot and save demo image
        if args.dst_img is not None:
            try:
                plot_results(im, probas, bboxes_scaled, args.classes,
                             os.path.join(args.dst_img, 'BBox_' + fname))
            except:
                print(f"Error with {img_name}")
                continue

        for p, i in zip(probas, bboxes_scaled):
            ann_item = {
                'area': (i[2] - i[0]) * (i[3] - i[1]),
                'bbox': [i[0], i[1], i[2] - i[0], i[3] - i[1]],
                'category_id': int(p[1]),
                'id': ann_id,
                'image_id': img_id,
                'iscrowd': 0,
                'probability': format(float(p[0]), '.2f')
            }
            annotations['annotations'].append(ann_item)
            ann_id += 1
        img_id += 1

        with open(args.dst_coco, 'w') as f:
            json.dump(annotations, f)
예제 #50
0
def trainEnc_MI(stats, model, optimizer, scheduler, dataloaders, device,
                kwargs):
    """This funcion performs training of DIM local version without prior distrib. The classifier can be wrapped into the model
    using the prior flag, in kwargs dictionary there are othe hyperparameters used for the training. Also tensorbord is available
    
    """
    num_epochs = kwargs['ep']
    writer = kwargs['writer']
    best_loss = kwargs['best_loss']
    t_board = kwargs['t_board']
    gamma = kwargs['gamma']
    beta = kwargs['beta']
    use_prior = kwargs['Prior_Flag']
    discriminator = kwargs['discriminator']

    gen_epoch = 0
    gen_epoch_l = 0

    best_model_wts = copy.deepcopy(model.state_dict())

    for epoch in range(num_epochs):
        stats['disk'].append(check_ext_mem("cl_ext_mem"))
        stats['ram'].append(check_ram_usage())
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        since = time.time()

        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:

            if use_prior:
                discriminator.requires_grad_(False)

            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()  # Set model to evaluate mode

            metrics = defaultdict(float)
            epoch_samples = 0
            batch_num = 0
            for inputs, labels in dataloaders[phase]:
                labels = labels.type(torch.long)
                torch.cuda.empty_cache()
                inputs = inputs.to(device)
                labels = labels.to(device)
                optimizer.zero_grad()
                #print(inputs.size(),inputs.dtype,labels.size(),labels.dtype)
                # forward
                with torch.set_grad_enabled(phase == 'train'):
                    E_phi, C_phi, A_phi = model(inputs)
                    loss = 0
                    #we use infoNCE MI approx. since it is more stable eventually for other exp call compute dim loss
                    #fenchel_dual_loss(C_phi, E_phi, measure='JSD')
                    #function already implemented
                    loss_MI = infonce_loss(C_phi, E_phi)

                    if use_prior:
                        loss += beta * loss_MI
                    else:
                        loss = loss_MI
                    metrics['MI_loss'] += loss.data.cpu().numpy()
                    ################################## section for prior Loss
                    if use_prior:
                        Q_samples = discriminator(A_phi)
                        disc_loss = compute_loss(Q_samples, labels, metrics)
                        loss += gamma * disc_loss

                    metrics['loss'] += loss.data.cpu().numpy()
                    ################################## backward and tensorboard: othre quantities can be added
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()
                        if batch_num % 20 == 0 and t_board:
                            # ...log the running loss
                            writer.add_scalar('training loss', loss,
                                              epoch * gen_epoch + batch_num)
                    if phase == 'val' and t_board:
                        if batch_num % 10 == 0:
                            # ...log the running loss
                            writer.add_scalar('Validation loss', loss,
                                              epoch * gen_epoch_l + batch_num)

                # statistics
                batch_num += 1
            ############ end of epochs

            epoch_loss = metrics['loss'] / batch_num

            if epoch == 0 and phase == 'train':
                gen_epoch = batch_num
            if epoch == 0 and phase == 'val':
                gen_epoch_l = batch_num

            if phase == 'train':
                avg = metrics['loss'] / batch_num
                scheduler.step()  #avg

                for param_group in optimizer.param_groups:
                    print("LR", param_group['lr'])

            #### Write and Save
            print_metrics(metrics, batch_num, phase)
            if phase == 'val' and epoch_loss < best_loss:
                print("saving best model")
                best_loss = epoch_loss
                best_model_wts = copy.deepcopy(model.state_dict())

        ############## Time Info
        time_elapsed = time.time() - since
        print('{:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))

    print('Best val loss: {:4f}'.format(best_loss))

    # load best model weights
    model.load_state_dict(best_model_wts)

    del best_model_wts
    return model, stats
예제 #51
0
 def setUp(self):
     torch.set_grad_enabled(False)
예제 #52
0
def trainEnc_MIadv(stats, model, optimizer, scheduler, dataloaders, device,
                   kwargs):
    """This funcion performs training of DIM local version without prior distrib. It can be wrapped into the DNN
       module as a class function  
    """
    num_epochs = kwargs['ep']
    writer = kwargs['writer']
    best_loss = kwargs['best_loss']
    t_board = kwargs['t_board']
    gamma = kwargs['gamma']
    beta = kwargs['beta']
    use_prior = kwargs['Prior_Flag']

    gen_epoch = 0
    gen_epoch_l = 0

    best_model_wts = copy.deepcopy(model.state_dict())

    model2 = copy.deepcopy(model)
    model2.load_state_dict(model.state_dict())

    for epoch in range(num_epochs):

        stats['disk'].append(check_ext_mem("cl_ext_mem"))
        stats['ram'].append(check_ram_usage())

        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        since = time.time()

        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:

            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()  # Set model to evaluate mode

            metrics = defaultdict(float)
            epoch_samples = 0
            batch_num = 0
            for inputs, labels in dataloaders[phase]:
                if len(inputs.shape) == 5:
                    inputs_ref = inputs[:, :, :, :, 1].to(device)
                    inputs = inputs[:, :, :, :, 0].to(device)
                else:
                    inputs = inputs.to(device)

                labels = labels.type(torch.long)
                torch.cuda.empty_cache()
                labels = labels.to(device)

                model2.requires_grad_(False)

                optimizer.zero_grad()
                #print(inputs.size(),inputs_ref.size())
                # forward
                with torch.set_grad_enabled(phase == 'train'):

                    loss = 0
                    #we use NCE MI approx. since it is more stable eventually for other exp call compute dim loss
                    #function already implemented i.e. fenchel_dual_loss(C_phi, E_phi, measure='JSD')
                    if use_prior:
                        ### combination of 3 losses: MI same batch MI across batches and classification score
                        ###
                        _, C_phi_ref, _, _ = model2(inputs_ref)
                        E_phi, C_phi, A_phi, pred = model(inputs)

                        loss_MI = infonce_loss(C_phi, E_phi)

                        metrics['loss_MI'] += loss_MI.data.cpu().numpy()
                        loss += beta * loss_MI

                        loss_MI_ref = infonce_loss(C_phi_ref.detach(), E_phi)
                        metrics['MI_REF_loss'] += loss_MI_ref.data.cpu().numpy(
                        )
                        loss += beta * loss_MI_ref

                        losscl = compute_loss(pred, labels, metrics)
                        metrics['CL_loss'] += losscl.data.cpu().numpy()
                        loss += beta * losscl

                    else:
                        ### combination of 2 losses: MI info and classification
                        E_phi, C_phi, A_phi, pred = model(inputs)
                        loss_MI = infonce_loss(C_phi, E_phi)
                        metrics['loss_MI'] += loss_MI.data.cpu().numpy()
                        losscl = compute_loss(pred, labels, metrics)
                        metrics['CL_loss'] += losscl.data.cpu().numpy()

                        loss = beta * loss_MI + beta * losscl

                    ################################## section for prior Loss
                    metrics['loss'] += loss.data.cpu().numpy()

                    ################################## backward and tensorboard: othre quantities can be added
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()
                        if batch_num % 20 == 0 and t_board:
                            # ...log the running loss
                            writer.add_scalar('training loss', loss,
                                              epoch * gen_epoch + batch_num)
                    if phase == 'val' and t_board:
                        if batch_num % 10 == 0:
                            # ...log the running loss
                            writer.add_scalar('Validation loss', loss,
                                              epoch * gen_epoch_l + batch_num)

                # statistics
                batch_num += 1
            ############ end of epochs

            epoch_loss = metrics['loss'] / batch_num

            if epoch == 0 and phase == 'train':
                gen_epoch = batch_num
            if epoch == 0 and phase == 'val':
                gen_epoch_l = batch_num

            if phase == 'train':
                avg = metrics['loss'] / batch_num
                scheduler.step()  #avg

                for param_group in optimizer.param_groups:
                    print("LR", param_group['lr'])

            #### Write and Save
            print_metrics(metrics, batch_num, phase)
            if phase == 'val' and epoch_loss < best_loss:
                print("saving best model")
                best_loss = epoch_loss
                best_model_wts = copy.deepcopy(model.state_dict())
                model2.load_state_dict(model.state_dict())

        ############## Time Info
        time_elapsed = time.time() - since
        print('{:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))

    print('Best val loss: {:4f}'.format(best_loss))

    # load best model weights
    model.load_state_dict(best_model_wts)

    del best_model_wts, model2
    return model, stats
 def forward(self, data, im_info, roidb=None, **rpn_kwargs):
     if cfg.PYTORCH_VERSION_LESS_THAN_040:
         return self._forward(data, im_info, roidb, **rpn_kwargs)
     else:
         with torch.set_grad_enabled(self.training):
             return self._forward(data, im_info, roidb, **rpn_kwargs)
예제 #54
0
def train_classifier(stats, model, optimizer, scheduler, dataloaders, device,
                     kwargs):
    """This funcion performs training of classifier HEAD. In kwargs dictionary there are othe hyperparameters used for the training.
    Also tensorbord is available
    """

    num_epochs = kwargs['ep']
    writer = kwargs['writer']
    best_loss = kwargs['best_loss']
    t_board = kwargs['t_board']

    gen_epoch = 0
    gen_epoch_l = 0

    best_model_wts = copy.deepcopy(model.state_dict())

    for epoch in range(num_epochs):
        stats['disk'].append(check_ext_mem("cl_ext_mem"))
        stats['ram'].append(check_ram_usage())
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        since = time.time()

        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()  # Set model to evaluate mode

            metrics = defaultdict(float)
            epoch_samples = 0
            batch_num = 0
            for inputs, labels in dataloaders[phase]:
                labels = labels.type(torch.long)
                torch.cuda.empty_cache()
                inputs = inputs.to(device)
                labels = labels.to(device)
                optimizer.zero_grad()
                # forward
                # track history if only in train
                #print(inputs.size(),inputs.dtype,labels.size(),labels.dtype)
                with torch.set_grad_enabled(phase == 'train'):

                    out = model(inputs)
                    loss = 0
                    loss = compute_loss(out, labels, metrics)

                    if phase == 'train':
                        loss.backward()
                        optimizer.step()
                        if batch_num % 20 == 0 and t_board:
                            writer.add_scalar('training loss', loss,
                                              epoch * gen_epoch + batch_num)

                    if phase == 'val' and t_board:
                        if batch_num % 10 == 0:
                            writer.add_scalar('Validation loss', loss,
                                              epoch * gen_epoch_l + batch_num)

                # statistics
                batch_num += 1
            epoch_loss = metrics['loss'] / batch_num

            if epoch == 0 and phase == 'train':
                gen_epoch = batch_num
            if epoch == 0 and phase == 'val':
                gen_epoch_l = batch_num
            if phase == 'train':
                scheduler.step()  #avg
                for param_group in optimizer.param_groups:
                    print("LR", param_group['lr'])

            print_metrics(metrics, batch_num, phase)

            if phase == 'val' and epoch_loss < best_loss:
                print("saving best model")
                best_loss = epoch_loss
                best_model_wts = copy.deepcopy(model.state_dict())

        time_elapsed = time.time() - since

        print('{:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))
    print('Best val loss: {:4f}'.format(best_loss))

    # load best model weights
    model.load_state_dict(best_model_wts)

    del best_model_wts
    return model, stats
def train(train_loader, model, optimizer, criterion, writer, count, epoch):
    losses = AverageMeter()
    top1 = AverageMeter()
    top5 = AverageMeter()

    # switch to train mode
    phase = 'train'
    model.train()
    iter_len = train_loader.__len__()
    for i in range(0, iter_len // train_cfg['per_batch_size']):
        ### Adjust learning rate
        # lr = adjust_lr_test(optimizer, count, train_cfg['init_lr'])
        model.train()
        batch_iterator = iter(
            DataLoader(train_loader,
                       train_cfg['per_batch_size'],
                       shuffle=True,
                       num_workers=args.num_workers,
                       collate_fn=detection_collate))
        input, target = next(batch_iterator)
        if train_cfg['cuda']:
            target = target.cuda()
            input = input.cuda()

        # input_var = torch.autograd.Variable(input)
        # target_var = torch.autograd.Variable(target)

        # compute output
        with torch.set_grad_enabled(phase == 'train'):
            output = model(input)
            loss = criterion(output, target.long())
            acc1, acc5 = accu(output.data, target, topk=(1, 5))

        # measure accuracy and record loss
        losses.update(loss.item(), input.size(0))
        top1.update(acc1[0], input.size(0))
        top5.update(acc5[0], input.size(0))

        # compute gradient and do SGD step
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        count += 1
        writer.add_scalar('lr',
                          optimizer.param_groups[0]['lr'],
                          global_step=count)
        writer = add_summery(writer, 'train', loss.data, acc1, acc5, count)

        if i % train_cfg['print_que'] == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'lr: [{3}]\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Acc@1 {top1.val:.3f} ({top1.avg:.3f})\t'
                  'Acc@5 {top5.val:.3f} ({top5.avg:.3f})'.format(
                      epoch,
                      i,
                      len(train_loader) // train_cfg['per_batch_size'],
                      optimizer.param_groups[0]['lr'],
                      loss=losses,
                      top1=top1,
                      top5=top5))

    return count, losses.avg
def train_model(model,
                criterion,
                optimizer,
                scheduler,
                fn_save,
                num_epochs=25):
    since = time.time()

    #best_model_wts = copy.deepcopy(model.state_dict())
    least_loss = 10000.0
    best_ep = 0

    tv_hist = {'train': [], 'val': []}

    for epoch in range(num_epochs):
        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:
            if phase == 'train':
                scheduler.step()
                model.train()  # Set model to training mode
            else:
                model.eval()  # Set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            # Iterate over data.
            for inputs, input_patch, labels, agatston_scores, manual_scores, img_id in dataloaders[
                    phase]:
                # Get images from inputs
                #print('*'*10 + ' printing inputs and labels ' + '*'*10)

                manual_scores = manual_scores.type(torch.FloatTensor)
                agatston_scores = agatston_scores.type(torch.FloatTensor)

                inputs = inputs.to(device)
                input_patch = input_patch.to(device)
                labels = labels.to(device)
                manual_scores = manual_scores.to(device)
                agatston_scores = agatston_scores.to(device)
                list = [inputs, manual_scores, agatston_scores, labels]

                # print(img_id)
                # print(manual_scores)
                # print(agatston_scores)
                # print(labels)
                # time.sleep(10)

                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    myresnet.myinputs = list
                    # print('{}'.format(list.__sizeof__()))
                    # outputs, mu, layvar = model(inputs)
                    outputs, code = model(inputs)
                    inputs = inputs.type(torch.cuda.FloatTensor)

                    inputs_array = inputs.data.cpu().numpy()
                    outputs_array = outputs.data.cpu().numpy()
                    save_sample(inputs_array[0, :, :, :], 'inputs')
                    save_sample(outputs_array[0, :, :, :], 'outputs')

                    # inputs = inputs.type(torch.cuda.LongTensor)
                    # outputs = outputs.type(torch.cuda.LongTensor)
                    # print('input size {}'.format(inputs.shape))
                    # print('input type {}'.format(inputs.dtype))
                    # print('output size {}'.format(outputs.shape))
                    # print('output type {}'.format(outputs.dtype))
                    loss = criterion(outputs, inputs)
                    # print('loss shape {}'.format(loss.shape))
                    # print('loss is {}'.format(loss))
                    # time.sleep(1)
                    # time.sleep(30)

                    # backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                # statistics
                running_loss += loss.item() * inputs.size(0)
                # running_corrects += torch.sum(preds == labels.data)

            epoch_loss = running_loss / dataset_sizes[phase]
            # epoch_acc = running_corrects.double() / dataset_sizes[phase]

            tv_hist[phase].append([epoch_loss])

            # deep copy the model
            if phase == 'val' and epoch_loss <= least_loss:
                least_loss = epoch_loss
                best_ep = epoch
                #best_model_wts = copy.deepcopy(model.state_dict())
                torch.save(model.state_dict(), fn_save)

        print('ep {}/{} - Train loss: {:.4f}, Val loss: {:.4f}'.format(
            epoch + 1, num_epochs, tv_hist['train'][-1][0],
            tv_hist['val'][-1][0]))
        training_progress[epoch][0] = tv_hist['train'][-1][0]
        # training_progress[epoch][1] = tv_hist['train'][-1][1]
        training_progress[epoch][1] = tv_hist['val'][-1][0]
        # training_progress[epoch][3] = tv_hist['val'][-1][1]
        #print('-' * 10)

        #print('{} Loss: {:.4f} Acc: {:.4f}'.format(
        #    phase, epoch_loss, epoch_acc))

    time_elapsed = time.time() - since
    print('*' * 10 + 'Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))
    print('*' * 10 +
          'Least Val Loss: {:4f} at epoch {}'.format(least_loss, best_ep))
    print()

    # load best model weights
    #model.load_state_dict(best_model_wts)
    #return model
    return tv_hist