Меня немного смущает значение initial_epoch в методах fit и fit_generator. Вот документ:

initial_epoch : целое число. Эпоха начала тренировки (полезно для возобновления предыдущего тренировочного цикла).

Понимаю, начинать тренироваться с нуля бесполезно. Это полезно, если вы обучили свой набор данных и хотите повысить точность или другие значения ( поправьте меня, если я ошибаюсь ). Но я не уверен, что он делает на самом деле.

Итак, после всего этого у меня есть 2 вопроса:

  1. Что делает initial_epoch и для чего он нужен?
  2. Когда я могу использовать initial_epoch?

    • Когда я изменяю свой набор данных?
    • Когда я меняю скорость обучения, оптимизатор или функцию потерь?
    • Оба?
8
ibrahimozgon 24 Сен 2018 в 12:23

2 ответа

Лучший ответ

Поскольку в некоторых оптимизаторах некоторые из их внутренних значений (например, скорость обучения) устанавливаются с использованием значения текущего epoch, или даже у вас может быть (custom) обратные вызовы, которые зависят от текущего значения epoch, аргумент initial_epoch позволяет укажите начальное значение epoch, с которого нужно начинать обучение.

Как указано в документации, это в основном полезно, когда вы обучили свою модель для некоторых эпох, скажем 10, а затем сохранили ее, и теперь вы хотите загрузить ее и возобновить обучение еще на 10 эпох без нарушения состояния эпохозависимые объекты (например, оптимизатор) . Таким образом, вы должны установить initial_epoch=10 (т.е. мы обучили модель для 10 эпох) и epochs=20 (не 10, так как общее количество эпох, которых нужно достичь, равно 20), а затем все возобновится, как если бы вы были изначально обучил модель за 20 эпох за одну тренировку.

Однако обратите внимание, что при использовании встроенных оптимизаторов Keras вам не нужно использовать initial_epoch , поскольку они хранят и обновляют свое состояние внутри (без учета значения текущей эпохи), а также при сохранении модели также будет сохранено состояние оптимизатора.

24
today 23 Дек 2018 в 13:12

Приведенный выше ответ верен, однако важно отметить, что если вы тренировались в течение 10 эпох и установили initial_epoch = 10 и epochs = 20, вы тренируетесь еще 10 эпох, пока не достигнете в общей сложности 20 эпох. Например, я тренировался для 2 эпох, затем установил initial_epoch = 2 и epochs = 4. В результате он тренируется еще 4-2 = 2 эпохи. Новые данные в объекте истории начинаются с эпохи 3. Таким образом, возвращенный объект истории действительно начинается с эпохи 1, как и следовало ожидать. Другими словами, состояние объекта истории не сохраняется от начальных эпох обучения. Если вы не устанавливаете initial_epoch и тренируетесь в течение 2 эпох, затем повторно запустите fit_generator с epochs = 4, он будет тренироваться еще 4 эпохи, начиная с состояния, сохраненного в конце второй эпохи (при условии, что вы используете встроенные оптимизаторы). Опять же, состояние объекта истории НЕ сохраняется из начального обучения и содержит данные только за последние 4 эпохи. Я заметил это, потому что я рисую график потери проверки в зависимости от эпох.

1
Gerry P 8 Ноя 2019 в 18:23