Пример #1
0
    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))
Пример #2
0
    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