def evaluate_model(self): """ Evaluates model by calculating the UC-JSD from generated structures. Saves model scores in `validation.csv` and then saves model state. """ self.model.eval() # sets layers to eval mode (e.g. norm, dropout) with torch.no_grad(): # deactivates autograd engine # generate graphs required for model evaluation # note that evaluation of the generated graphs happens in # `generate_graphs()`, and molecules are saved as `self` attributes self.generate_graphs(n_samples=self.C.n_samples, evaluation=True) print("* Evaluating model.", flush=True) anal.evaluate_model(valid_dataloader=self.valid_dataloader, train_dataloader=self.train_dataloader, nll_per_action=self.nll_per_action, model=self.model) self.nll_per_action = None # don't need anymore print(f"* Saving model state at Epoch {self.current_epoch}.", flush=True) # `pickle.HIGHEST_PROTOCOL` good for large objects model_path_and_filename = (self.C.job_dir + f"model_restart_{self.current_epoch}.pth") torch.save(obj=self.model, f=model_path_and_filename, pickle_protocol=pickle.HIGHEST_PROTOCOL)
def testing_phase(self): """ Evaluates model using test set data. """ self.test_dataloader = self.get_dataloader(self.test_h5_path, "test set") self.get_ts_properties() self.restart_epoch = util.get_restart_epoch() print( f"* Loading model from previous saved state (Epoch {self.restart_epoch}).", flush=True) self.model = torch.load(self.C.job_dir + f"model_restart_{self.restart_epoch}.pth") self.model.eval() with torch.no_grad(): self.generate_graphs(n_samples=self.C.n_samples) print("* Evaluating model.", flush=True) anal.evaluate_model(valid_dataloader=self.test_dataloader, train_dataloader=self.train_dataloader, nll_per_action=self.nll_per_action, model=self.model) self.print_time_elapsed()