Пример #1
0
    def test_TrainerEmbedding_cached(self):
        set_seed(3)
        criterion = TripletLossSampler(nn.TripletMarginLoss())
        trainer = TrainerEmbedding(
            self.model,
            criterion=criterion,
            data_loader=self.data_loader,
            optimizer=self.optimizer,
            scheduler=self.scheduler,
            accuracy_measure=AccuracyEmbedding(cache=True))
        trainer.open_monitor(offline=True)

        # TripletLoss is not deterministic; fix the seed
        set_seed(4)
        loss_cached = trainer.full_forward_pass(train=True)
        accuracy_cached = trainer.update_accuracy(train=True)

        trainer.accuracy_measure.cache = False
        trainer.accuracy_measure.reset()

        set_seed(4)
        loss = trainer.full_forward_pass(train=True)
        accuracy = trainer.update_accuracy(train=True)

        self.assertAlmostEqual(loss_cached.item(), loss.item())
        self.assertAlmostEqual(accuracy_cached, accuracy)
def train_matching_pursuit(dataset_cls=MNIST, n_epochs=5):
    # Typically, the 'out_features', the second parameter of MatchingPursuit
    # model, should be greater than the 'in_features'.
    # In case of MNIST, it works even with the smaller values, but the
    # resulting embedding vector is dense.

    model = MatchingPursuit(784, 256, solver=BasisPursuitADMM())
    # model = LISTA(784, 128)

    data_loader = DataLoader(dataset_cls,
                             transform=TransformDefault.mnist(
                                 normalize=None
                             ))
    criterion = LossPenalty(nn.MSELoss(), lambd=model.lambd)
    optimizer, scheduler = get_optimizer_scheduler(model)
    trainer = TrainMatchingPursuit(model,
                                   criterion=criterion,
                                   data_loader=data_loader,
                                   optimizer=optimizer,
                                   scheduler=scheduler,
                                   accuracy_measure=AccuracyEmbedding())
    trainer.restore()
    n_epochs = max(n_epochs - trainer.epoch, 0)
    trainer.train(n_epochs=n_epochs, mutual_info_layers=0)
    return trainer.model
Пример #3
0
    def test_TrainerAutoencoder_cached(self):
        set_seed(3)
        model = AutoencoderLinear(784, 64)
        trainer = TrainerAutoencoder(
            model,
            criterion=nn.BCEWithLogitsLoss(),
            data_loader=self.data_loader,
            optimizer=self.optimizer,
            scheduler=self.scheduler,
            accuracy_measure=AccuracyEmbedding(cache=True))
        trainer.open_monitor(offline=True)

        # TripletLoss is not deterministic; fix the seed
        set_seed(4)
        loss_cached = trainer.full_forward_pass(train=True)
        accuracy_cached = trainer.update_accuracy(train=True)

        trainer.accuracy_measure.cache = False
        trainer.accuracy_measure.reset()

        set_seed(4)
        loss = trainer.full_forward_pass(train=True)
        accuracy = trainer.update_accuracy(train=True)

        self.assertAlmostEqual(loss_cached.item(), loss.item())
        self.assertAlmostEqual(accuracy_cached, accuracy)
def test_matching_pursuit(dataset_cls=MNIST):
    # vanilla Matching Pursuit: the weights are fixed, no training
    model = MatchingPursuit(784, 2048)
    data_loader = DataLoader(dataset_cls,
                             eval_size=10000,
                             transform=TransformDefault.mnist(
                                 normalize=None
                             ))
    trainer = TestMatchingPursuit(model,
                                  criterion=nn.MSELoss(),
                                  data_loader=data_loader,
                                  optimizer=OptimizerStub(),
                                  accuracy_measure=AccuracyEmbedding())
    trainer.train(n_epochs=1, mutual_info_layers=0)
Пример #5
0
def train_autoencoder(n_epoch=60, dataset_cls=MNIST):
    model = AutoencoderLinear(784, 128)
    data_loader = DataLoader(dataset_cls,
                             transform=TransformDefault.mnist(normalize=None))
    criterion = nn.BCEWithLogitsLoss()
    optimizer, scheduler = get_optimizer_scheduler(model)
    trainer = TrainerAutoencoder(
        model,
        criterion=criterion,
        data_loader=data_loader,
        optimizer=optimizer,
        scheduler=scheduler,
        accuracy_measure=AccuracyEmbedding(cache=True))
    # trainer.restore()  # uncomment to restore the saved state
    trainer.monitor.advanced_monitoring(level=MonitorLevel.SIGNAL_TO_NOISE)
    trainer.train(n_epochs=n_epoch, mutual_info_layers=0)
Пример #6
0
 def __init__(self,
              model: nn.Module,
              criterion: nn.Module,
              data_loader: DataLoader,
              optimizer: Optimizer,
              scheduler: Union[_LRScheduler, ReduceLROnPlateau] = None,
              accuracy_measure: Accuracy = AccuracyEmbedding(),
              **kwargs):
     if not isinstance(accuracy_measure, AccuracyEmbedding):
         raise ValueError("'accuracy_measure' must be of instance "
                          f"{AccuracyEmbedding.__name__}")
     super().__init__(model=model,
                      criterion=criterion,
                      data_loader=data_loader,
                      optimizer=optimizer,
                      scheduler=scheduler,
                      accuracy_measure=accuracy_measure,
                      **kwargs)
def train_lista(dataset_cls=MNIST):
    model_ref = train_matching_pursuit(dataset_cls=dataset_cls)
    model = LISTA(784, out_features=model_ref.out_features)
    data_loader = DataLoader(dataset_cls,
                             transform=TransformDefault.mnist(
                                 normalize=None
                             ))
    criterion = nn.MSELoss()
    optimizer, scheduler = get_optimizer_scheduler(model)
    trainer = TrainLISTA(model,
                         model_reference=model_ref,
                         criterion=criterion,
                         data_loader=data_loader,
                         optimizer=optimizer,
                         scheduler=scheduler,
                         accuracy_measure=AccuracyEmbedding())
    # trainer.monitor.advanced_monitoring(level=MonitorLevel.FULL)
    trainer.train(n_epochs=10, mutual_info_layers=0)
Пример #8
0
 def __init__(self,
              model: nn.Module,
              criterion: nn.Module,
              data_loader: DataLoader,
              accuracy_measure: Accuracy = None,
              mutual_info=None,
              env_suffix='',
              checkpoint_dir=CHECKPOINTS_DIR):
     if torch.cuda.is_available():
         model.cuda()
     self.model = model
     self.criterion = criterion
     self.data_loader = data_loader
     self.train_loader = data_loader.get(train=True)
     if mutual_info is None:
         mutual_info = MutualInfoNeuralEstimation(data_loader)
     self.mutual_info = mutual_info
     self.checkpoint_dir = Path(checkpoint_dir)
     self.timer = timer
     self.timer.init(batches_in_epoch=len(self.train_loader))
     self.timer.set_epoch(0)
     criterion_name = self.criterion.__class__.__name__
     if isinstance(criterion, LossPenalty):
         criterion_name = f"{criterion_name}(" \
                          f"{criterion.criterion.__class__.__name__})"
     self.env_name = f"{time.strftime('%Y.%m.%d')} " \
                     f"{model.__class__.__name__}: " \
                     f"{data_loader.dataset_cls.__name__} " \
                     f"{self.__class__.__name__} " \
                     f"{criterion_name}"
     env_suffix = env_suffix.lstrip(' ')
     if env_suffix:
         self.env_name = f'{self.env_name} {env_suffix}'
     if accuracy_measure is None:
         if isinstance(self.criterion, PairLossSampler):
             accuracy_measure = AccuracyEmbedding()
         else:
             # cross entropy loss
             accuracy_measure = AccuracyArgmax()
     self.accuracy_measure = accuracy_measure
     self.monitor = self._init_monitor(mutual_info)
     self.online = self._init_online_measures()
     self.best_score = 0.