Может ли model.compile() инициализировать все веса и смещения в Keras (endorflow backend)?

Когда я начинаю обучение модели, модель не сохраняется ранее. Я могу использовать model.compile() безопасно. Я сохранил модель в файле h5 для дальнейшего обучения с помощью checkpoint.

Скажем, я хочу еще больше обучить модель. Я смущен в этом пункте: могу ли я использовать model.compile() здесь? И должен ли он быть размещен до или после инструкции model = load_model()? Если model.compile() повторно инициализирует все веса и смещения, я должен поместить его перед выражением model = load_model().

После обнаружения некоторых обсуждений мне кажется, что model.compile() нужен только тогда, когда у меня нет модели, сохраненной ранее. Как только я сохранил модель, нет необходимости использовать model.compile(). Это правда или ложь? И когда я хочу предсказать использование обученной модели, следует ли использовать model.compile() перед предсказанием?

Ответ 1

Когда использовать?

Если вы используете compile, это обязательно должно быть после load_model(). В конце концов, вам нужна модель для компиляции. (PS: load_model автоматически компилирует модель с оптимизатором, который был сохранен вместе с моделью)

Что делает compile?

Компиляция определяет функцию потерь, оптимизатор и метрики. Все это.

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

Для обучения вам нужна скомпилированная модель (потому что для обучения используются функция потерь и оптимизатор). Но не обязательно составлять модель для прогнозирования.

Вам нужно использовать компиляцию более одного раза?

Только если:

  • Вы хотите изменить один из них:
    • Функция потери
    • Оптимизатор/Скорость обучения
    • метрика
  • Вы загрузили (или создали) модель, которая еще не скомпилирована. Или ваш метод загрузки/сохранения не учитывал предыдущую компиляцию.

Последствия повторной компиляции:

Если вы снова скомпилируете модель, вы потеряете состояния оптимизатора.

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

Ответ 2

Не забывайте, что вам также нужно скомпилировать модель после изменения флага trainable слоя, например, когда вы хотите настроить модель, подобную этой:

  1. загрузить модель VGG без верхнего классификатора

  2. заморозить все слои (т.е. trainable = False)

  3. добавить несколько слоев наверх

  4. скомпилировать и обучить модель на некоторых данных

  5. разморозьте некоторые слои VGG, установив trainable = True

  6. Скомпилируйте модель еще раз (НЕ ЗАБУДЬТЕ ЭТОТ ШАГ!)

  7. обучить модель по некоторым данным