Копирование нейронной сети Python - PullRequest
0 голосов
/ 23 октября 2018

Я с большим удовольствием пытаюсь получить лучшую модель нейронной сети, делая раннюю остановку.Я не использую никаких фреймворков, таких как TensorFlow или Keras, это код, который я разрабатывал в классе.Следующие шаги:

  • Создание моей модели (инициализация слоев, веса и смещения, правила обучения)
  • Определение некоторого терпения на ранней остановке
  • Обучение модели,вызов функции поезда, которая пытается минимизировать ошибку и обновить модель на месте.
  • В функции обучения я проверяю ошибку в действительной ошибке для моей ранней остановки.Если ошибка в действительном наборе является наименьшей из тех, которые были замечены, я обновляю self.best_model с помощью self.model (я должен использовать глубокую копию).
  • Если после X эпох я не увидел улучшения от моего жилетаДопустимая ошибка, я прекращаю обучение, копирую self.best_model в self.model и выхожу из функции.

Функция обучения не возвращает модель, но обновляется после выхода из нее с тем, что было сделано до глубокого копирования в нее self.best_model, поэтому self.model = deepcopy(self.best_model), похоже, ничего не делает.

Примерно так:

class Optimiser(object):
    def __init__(self, model, early_stop_patience, learning_settings,...):
        self.model = model
        self.best_model = model
        self.patience = self.early_stop_patience
        self.min_error = 10000
        self.stop = False
        ...

    def check_early_stop(self, valid_error):
        if valid_error < self.min_error:
            self.best_model = deepcopy(self.model)
            self.counter = 0
        else:
            self.counter += 1

        if self.counter == self.patience:
            self.model = deepcopy(self.best_model) # This seems to work inside this function.
            self.stop = True

    def train(self, num_epochs):
        for epoch in range(1, num_epochs):
            self.do_train_epoch() # This one takes self.model and forward propagates and then back propagates.
            valid_error = self.get_epoch_stats() # the datasets are also received by the __init__ method, and uses self.model to forward propagate them and calculate error.
            self.check_early_stop(valid_error)
            if self.stop:
                break

model = create_model(layers, weights, bias) 
optimiser = Optimiser(model, early_stop_patience, learning_settings,...)
optimiser.train(num_epochs=50)
model.forward_prop(test_set, targets)  
## This model should be the one saved when self.check_early_stop
##  found a new self.min_error, but is the last one actually,
## when it ran out of patience (as if 
## self.model hadn't been updated by self.best_model
## that was found self.patience epochs befores.
## Unless I do return self.model (after updating it with self.best_model),
## in which case I would have to do something like 
## model, stats, ..., stuff = optimiser.train(num_epochs=50)
##  I won't see it in my model variable being updated.

В коде есть еще кое-что, я действительно возвращаю некоторую статистику после этого перерыва.

Я использовал dill, чтобы написать обаself.model и self.best_model в файл и загрузили их, и они - то, что я ожидал, но не из функции.

Может быть, код или мое объяснение не так понятно, как есть, если вы заинтересованыЯ мог бы показать вам больше кода в частном порядке.

Любая помощь будет оценена по достоинству!

Спасибо!

Редактировать: Внесены некоторые исправления в нижний комментарий блока кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...