def evaluate(self, save_name=None): if save_name is None: model = self.model.cuda() else: save_path = "%s%s.mdl" % (PathConfig.MODEL_PATH, save_name) print("Loading model from %s..." % save_path) model = torch.load(save_path).cuda() print("Loaded.\n") total = ceil(len(self.data["test"][0]) / NetworkConfig.BATCH_SIZE) * NetworkConfig.BATCH_SIZE correct_count = 0 bar = ProgressBar(total, "Testing model...") progress = 0 for batch in Data.batches(self.data["test"]): X, Y = batch[0], batch[1] output = model(X) output = numpy.round(output.cpu().detach().numpy() * 5) Y = numpy.round(numpy.array(Y) * 5) correct_count += numpy.sum(output == Y) progress += NetworkConfig.BATCH_SIZE bar.refresh(progress) bar.finish("Accuracy: %f" % (correct_count / total))
def optimize(self, save_name=None): best_model = self.model min_loss = float("inf") total = 0 for phase in Network.Phase: total += NetworkConfig.EPOCH * \ ceil(len(self.data[str(phase)][0]) / NetworkConfig.BATCH_SIZE) * NetworkConfig.BATCH_SIZE bar = ProgressBar(total, "Training model...") progress = 0 for epoch in range(NetworkConfig.EPOCH): for phase in Network.Phase: if phase is Network.Phase.TRAIN: if self.lr_scheduler: self.model = self.lr_scheduler(self.model, NetworkConfig.EPOCH) self.model.train() else: self.model.eval() running_loss = 0.0 for batch in Data.batches(self.data[str(phase)]): self.optimizer.zero_grad() X, Y = batch[0], torch.Tensor(batch[1]).cuda() output = self.model(X) loss = self.loss_function(output, Y) if phase is Network.Phase.TRAIN: loss.backward() self.optimizer.step() progress += NetworkConfig.BATCH_SIZE bar.refresh(progress) running_loss += loss.data.cpu().numpy() epoch_loss = running_loss / len(self.data[str(phase)]) if phase is Network.Phase.TRIAL and epoch_loss < min_loss: best_model = copy.deepcopy(self.model) min_loss = epoch_loss bar.finish( "Model has been optimized in %d epochs with %f as its minimal loss." % (NetworkConfig.EPOCH, min_loss)) if save_name is None: save_name = time.strftime("%Y%m%d_%H%M%S") save_path = "%s%s.mdl" % (PathConfig.MODEL_PATH, save_name) print("Saving model into %s..." % save_path) torch.save(best_model, save_path) print("Saved.\n") self.model = best_model