Я с большим удовольствием пытаюсь получить лучшую модель нейронной сети, делая раннюю остановку.Я не использую никаких фреймворков, таких как 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
в файл и загрузили их, и они - то, что я ожидал, но не из функции.
Может быть, код или мое объяснение не так понятно, как есть, если вы заинтересованыЯ мог бы показать вам больше кода в частном порядке.
Любая помощь будет оценена по достоинству!
Спасибо!
Редактировать: Внесены некоторые исправления в нижний комментарий блока кода