Инициализирует ли model.compile () все веса и смещения в Keras (бэкэнд тензорного потока)?

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

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

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


person Preetom Saha Arko    schedule 27.12.2017    source источник


Ответы (2)


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

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

Что делает compile?

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

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

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

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

Только если:

  • You want to change one of these:
    • Loss function
    • Оптимизатор / Скорость обучения
    • Метрики
    • Свойство trainable некоторого слоя
  • Вы загрузили (или создали) модель, которая еще не скомпилирована. Или ваш метод загрузки / сохранения не учитывает предыдущую компиляцию.

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

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

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

person Daniel Möller    schedule 27.12.2017
comment
Будет ли использоваться потерять все состояния оптимизатора после повторной компиляции, даже если вы изначально сохранили модель с помощью include_optimizer = True? - person kawingkelvin; 29.03.2018
comment
Вам нужно перекомпилировать с тем же оптимизатором ... но я не уверен, что это возможно. - person Daniel Möller; 29.03.2018
comment
@ DanielMöller: Влияет ли это на model.outputs, т.е. после компиляции и перед компиляцией, в чем разница между ними? Также было бы здорово, если бы вы могли объяснить использование compile=False в load_model(model, compile=False/True) аргументе. - person aspiring1; 01.07.2019
comment
Ничего не меняется. Компиляция - это установка оптимизатора и функции потерь для обучения, вот и все. Если вы хотите загрузить модель и не будете ее обучать, компилировать ее не нужно. 1 - compile=True: модель загрузится и скомпилируется с теми же настройками, что и сохраненные. 2 - compile=False, вы загрузите только модель без оптимизатора. - person Daniel Möller; 01.07.2019
comment
@ DanielMöller как насчет общей рекомендации использовать model.compile после изменения атрибута обучаемого слоя? Это описано в ваших пунктах, когда использовать компиляцию модели? А как насчет изменения веса слоя с помощью set_weights ()? - person hirschme; 31.10.2019
comment
Спасибо, что напомнили мне trainable. Но с установкой весов проблем нет. - person Daniel Möller; 31.10.2019
comment
Могу ли я повторно использовать экземпляр Optimizer (вместо передачи adam), чтобы его состояние не сбрасывалось при перекомпиляции модели? Мне нужно изменить trainable на нескольких слоях посередине. - person LOST; 13.12.2020
comment
@LOST, да, можно, - person Daniel Möller; 14.12.2020

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

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

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

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

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

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

  6. снова скомпилируйте модель (НЕ ЗАБЫВАЙТЕ ЭТОТ ШАГ!)

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

person today    schedule 21.12.2018
comment
Каков будет результат, если модель не будет скомпилирована после изменения обучаемого флага слоя? - person Kake_Fisk; 13.08.2020
comment
@Kake_Fisk Изменение не будет эффективным, т.е. статус обучаемости слоя останется таким, каким он был до последнего вызова compile метода. - person today; 13.08.2020