Вызов "fit_generator ()" несколько раз в Керасе - PullRequest
2 голосов
/ 13 июня 2019

У меня есть функция генератора, которая генерирует наборы (входы, цели), на которых обучается моя модель, используя метод fit_generator() в Керасе.

Мой набор данных разделен на 9 равных частей. Я хочу выполнить перекрестную проверку с отрывом от одного набора данных, используя метод fit_generator(), и сохранить изученные параметры предыдущего обучения без изменений.

Мой вопрос заключается в том, что вызовет fit_generator() несколько раз для модели, чтобы она заново изучила свои изученные параметры на предыдущем поезде и проверочные наборы с нуля, или он сохранит эти изученные параметры без изменений, что приведет к повышению точности?

После небольшого копания я обнаружил, что метод fit() в Keras сохраняет изученные параметры, как здесь Многократный вызов "fit" в Keras , но я не уверен, что то же самое происходит для fit_generator() и, если это возможно, может использоваться для перекрестной проверки данных.

Псевдокод, который я собираюсь реализовать для перекрестной проверки, выглядит следующим образом:

class DatasetGenerator(Sequence):
    def __init__(validation_id, mode):
        #Some code

    def __getitem__():
        #The generator function

        #Some code

        return (inputs, targets)

for id in range(9):

    train_set = DatasetGenerator(id, 'train') 
    #train_set contains all 8 parts leaving the id part out for validation.

    validation_set = DatasetGenerator(id, 'val')
    #val_set contains the id part.

    history = model.fit_generator(train_set, epochs = 10, steps_per_epoch = 24000, validation_data = val_set, validation_steps = 3000)

print('History Dict:', history.history)
results = model.evaluate_generator(test_set, steps=steps)
print('Test loss, acc:', results)

Будет ли model сохранять изученные параметры без изменений и улучшать их для каждой итерации цикла for?

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

fit и fit_generator ведут себя одинаково в этом отношении, их повторный вызов возобновит обучение с ранее обученных весов.

Также обратите внимание, что вы пытаетесь не выполнять перекрестную проверку,Что касается реальной перекрестной проверки, вы тренируете одну модель для каждого сгиба, и модели полностью независимы, не продолжая обучение с предыдущего сгиба.

1 голос
/ 13 июня 2019

Насколько я знаю, он сохранит предыдущие обученные параметры.Кроме того, я думаю, что то, что вы пытаетесь сделать, может быть сделано путем изменения метода on_epoch_end () в Sequence.Может быть что-то вроде этого:

class DatasetGenerator(Sequence):
    def __init__(self, id, mode):
        self.id = id
        self.mode = mode
        self.current_epoch=0
        #some code

    def __getitem__(self, idx):
        id = self.id
        #Some code
        return (inputs, targets)

    def on_epoch_end():
        self.current_epoch += 1
        if self.current_epoch % 10 == 0:
            self.id += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...