Exemplo n.º 1
0
    def _perform_training(self,
                          data_csv_path,
                          model,
                          num_epochs,
                          trained_epochs=0,
                          plot_metrics=False):
        train_df, validation_df, _ = TrainingUtils.split_train_val_test(
            data_csv_path)
        dataloader = retrieve_train_dataloader(train_df,
                                               self.vocab,
                                               batch_size=self.batch_size)

        loss_func = nn.CrossEntropyLoss(ignore_index=self.vocab.stoi["<PAD>"])
        optimizer = optim.Adam(model.parameters(), lr=3e-4)
        vocab_size = len(self.vocab)

        train_losses, val_losses = [], []
        train_levenshteins, val_levenshteins = [], []

        for epoch in tqdm(range(trained_epochs + 1,
                                trained_epochs + num_epochs + 1),
                          position=0,
                          leave=True):
            print("\n Epoch: ", epoch)
            for image, captions in tqdm(dataloader):
                image, captions = image.to(device), captions.to(device)

                optimizer.zero_grad()

                outputs = model(image, 'train', captions)
                targets = captions[:, 1:]  # Remove <SOS> token

                loss = loss_func(outputs.view(-1, vocab_size),
                                 targets.reshape(-1))
                loss.backward()
                optimizer.step()

            model.eval()
            print(f'Training set evaluation:')
            train_loss, train_levenshtein = TrainingUtils.evaluate_model_on_dataset(
                model, train_df, self.sequence_length, self.batch_size,
                self.vocab, 'eval')
            train_losses.append(train_loss)
            train_levenshteins.append(train_levenshtein)

            print(f'Validation set evaluation:')
            val_loss, val_levenshtein = TrainingUtils.evaluate_model_on_dataset(
                model, validation_df, self.sequence_length, self.batch_size,
                self.vocab, 'eval')
            val_losses.append(val_loss)
            val_levenshteins.append(val_levenshtein)

            model.train()

            if plot_metrics and train_losses and train_levenshteins and val_losses and val_levenshteins:
                TrainingUtils.plot_metrics(train_losses, train_levenshteins,
                                           val_losses, val_levenshteins)

            self._save_model(model, epoch)
    def _perform_training(self,
                          data_csv_path,
                          model,
                          num_epochs,
                          trained_epochs=0,
                          plot_metrics=False):
        train_df, validation_df, _ = TrainingUtils.split_train_val_test(
            data_csv_path)
        dataloader = retrieve_train_dataloader(train_df,
                                               self.vocab,
                                               batch_size=self.batch_size)

        loss_func = nn.CrossEntropyLoss(ignore_index=self.vocab.stoi["<PAD>"])
        optimizer = optim.Adam(model.parameters(), self.LEARNING_RATE)

        train_losses, val_losses = [], []
        train_levenshteins, val_levenshteins = [], []
        for epoch in tqdm(range(trained_epochs + 1,
                                trained_epochs + num_epochs + 1),
                          position=0,
                          leave=True):
            print("\nEpoch: ", epoch)

            for images, captions in tqdm(dataloader):
                images, captions = images.to(device), captions.to(device)

                optimizer.zero_grad()

                targets = captions[:, 1:]
                preds = model(images, 'train', captions)
                loss = loss_func(preds.reshape(-1, self.vocab_size),
                                 targets.reshape(-1))

                loss.backward()
                torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1)
                optimizer.step()

            model.eval()
            print(f'Training set evaluation:')
            train_loss, train_levenshtein = TrainingUtils.evaluate_model_on_dataset(
                model, train_df, None, self.batch_size, self.vocab, 'train')
            train_losses.append(train_loss)
            train_levenshteins.append(train_levenshtein)

            print(f'Validation set evaluation:')
            val_loss, val_levenshtein = TrainingUtils.evaluate_model_on_dataset(
                model, validation_df, None, self.batch_size, self.vocab,
                'train')
            val_losses.append(val_loss)
            val_levenshteins.append(val_levenshtein)
            model.train()

            if plot_metrics and train_losses and train_levenshteins and val_losses and val_levenshteins:
                TrainingUtils.plot_metrics(train_losses, train_levenshteins,
                                           val_losses, val_levenshteins)

            self._save_model(model, epoch)
    def evaluate(self, data_csv_path: str, model_state_file):
        torch.cuda.empty_cache()
        saved_params = torch.load(model_state_file)

        model = EncoderDecoderVisualTransformer(
            sequence_length=self.sequence_length, vocab=self.vocab).to(device)

        model.load_state_dict(saved_params['state_dict'])
        model.eval()
        dataframe = pd.read_csv(data_csv_path)

        TrainingUtils.evaluate_model_levenshtein(model, dataframe,
                                                 self.sequence_length,
                                                 self.batch_size, self.vocab)
    def predict(self, data_csv_path: str, model_state_file):
        torch.cuda.empty_cache()
        saved_params = torch.load(model_state_file)

        model = EncoderDecoderVisualTransformer(
            sequence_length=self.sequence_length, vocab=self.vocab).to(device)

        model.load_state_dict(saved_params['state_dict'])
        model.eval()
        dataframe = pd.read_csv(data_csv_path)

        results_file_name = data_csv_path.replace(".csv", "_results.csv")
        TrainingUtils.predict_on_dataset(model, dataframe, self.batch_size,
                                         self.vocab, results_file_name)
Exemplo n.º 5
0
    def evaluate(self, data_csv_path: str, model_state_file):
        torch.cuda.empty_cache()
        saved_params = torch.load(model_state_file)
        self.embed_size = saved_params['embed_size']
        self.attention_dim = saved_params['attention_dim']
        self.encoder_dim = saved_params['encoder_dim']
        self.decoder_dim = saved_params['decoder_dim']

        model = EncoderDecoder(embed_size=self.embed_size,
                               vocab_size=len(self.vocab),
                               attention_dim=self.attention_dim,
                               encoder_dim=self.encoder_dim,
                               decoder_dim=self.decoder_dim,
                               sequence_length=self.sequence_length,
                               vocab=self.vocab).to(device)
        model.load_state_dict(saved_params['state_dict'])
        model.eval()

        dataframe = pd.read_csv(data_csv_path)
        TrainingUtils.evaluate_model_levenshtein(model, dataframe,
                                                 self.sequence_length,
                                                 self.batch_size, self.vocab)
Exemplo n.º 6
0
    def predict(self, data_csv_path: str, model_state_file):
        torch.cuda.empty_cache()
        saved_params = torch.load(model_state_file)
        self.embed_size = saved_params['embed_size']
        self.attention_dim = saved_params['attention_dim']
        self.encoder_dim = saved_params['encoder_dim']
        self.decoder_dim = saved_params['decoder_dim']

        model = EncoderDecoder(embed_size=self.embed_size,
                               vocab_size=len(self.vocab),
                               attention_dim=self.attention_dim,
                               encoder_dim=self.encoder_dim,
                               decoder_dim=self.decoder_dim,
                               sequence_length=self.sequence_length,
                               vocab=self.vocab).to(device)
        model.load_state_dict(saved_params['state_dict'])
        model.eval()

        dataframe = pd.read_csv(data_csv_path)
        results_file_name = data_csv_path.replace(".csv", "_results.csv")
        TrainingUtils.predict_on_dataset(model, dataframe, self.batch_size,
                                         self.vocab, results_file_name)