Может ли 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
слоя, например, когда вы хотите настроить модель, подобную этой:
загрузить модель VGG без верхнего классификатора
заморозить все слои (т.е. trainable = False
)
добавить несколько слоев наверх
скомпилировать и обучить модель на некоторых данных
разморозьте некоторые слои VGG, установив trainable = True
Скомпилируйте модель еще раз (НЕ ЗАБУДЬТЕ ЭТОТ ШАГ!)
обучить модель по некоторым данным