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)
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)
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)