Сохраняет ли Keras ModelCheckpoint лучшую модель из нескольких сеансов настройки?

Если у меня есть модель Keras, оснащенная обратным вызовом ModelCheckpoint, и я подгоняю ее за несколько «сеансов подгонки» (т. е. я вызываю model.fit() несколько раз), будет ли обратный вызов сохранять лучшую модель в самом последнем сеансе подгонки или лучшую модель из всех подгонок? сессии?

Спасибо.

Пожалуйста, попробуйте добавить некоторые фрагменты того, что вы пробовали

Aryan 23.12.2020 06:43
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
4
1
2 011
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Он сохранит лучшую модель из последней примерки.

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

Denziloe 25.02.2021 03:01

Это сохранит модель напоследок fit(), поскольку вы, по сути, перезаписываете один и тот же файл.

Если вы хотите найти лучшую модель за N итераций, вы должны сохранить их с префиксом N в имени файла. Таким образом, он сохранит лучшую модель для конкретного fit(), и вы сможете легко сравнить их позже. Вы можете просто вручную добавить N, то есть 1,2,3,N для каждого fit().

// Example
ModelCheckpoint(
        '/home/jupyter/checkpoint/best_model_{N}.h5',
        monitor = "val_loss",
        save_best_only=True,
        save_weights_only=False,
        mode = "min")
Ответ принят как подходящий

Хороший вопрос. Я провел эксперимент с существующей моделью и набором данных. Я создал обратный вызов контрольной точки, как показано, и использовал его в model.fit.

file_path1=r'c:\temp\file1'
mchk=tf.keras.callbacks.ModelCheckpoint( filepath=file_path1,  monitor = "val_loss", verbose=1,
    save_best_only=True, save_weights_only=True, mode = "auto", save_freq = "epoch" )

history = model.fit(X_train, Y_train, validation_data=val_data,
                     batch_size= 128, epochs= 5,  verbose= 1, callbacks=[mchk])

Я сохранил только веса и сохранил только веса для эпохи с наименьшими потерями проверки. Я установил verbose=1 в обратном вызове, чтобы видеть значения потерь при проверке в каждую эпоху. Затем я снова запустил тот же код, но я изменил имя файлапуть к файлу2. Код для этого ниже

file_path2=r'c:\temp\file2'
mchk=tf.keras.callbacks.ModelCheckpoint( filepath=file_path2,  monitor = "val_loss", verbose=1,
    save_best_only=True, save_weights_only=True, mode = "auto", save_freq = "epoch" )

history = model.fit(X_train, Y_train, validation_data=val_data,
                     batch_size= 128, epochs= 5,  verbose= 1, callbacks=[mchk])

Теперь model.fit сохраняет свое состояние в конце сеанса, поэтому, если вы запустите его во второй раз он начинается с того места, где он остановился. Однако он не сохраняет состояние обратного вызова. Таким образом, при втором запуске обратный вызов инициализирует потерю проверки как np.inf, поэтому он будет сохраните веса в конце первой эпохи наверняка. Если вы не измените имя файла, он перезапишет файл, который вы сохранили из-за первого запуска. Если во втором прогоне значение потерь при валидации, для которых были сохранены веса, НИЖЕ, чем потери при валидации при первом прогоне, то вы получите в итоге наилучшие сохраненные веса. Однако, если во втором прогоне потеря проверки выше, чем в первом прогоне, вы не сохраните ОБЩИЕ лучшие веса. Вот как это работает в случае, когда обратный вызов имеет save_weights_only=True. Я подумал, что это может вести себя по-другому, если вы сохраните всю модель, потому что в этом случае она может сохранить состояние обратного вызова. Поэтому я повторил эксперимент с save_weights_only=False. Результаты показывают, что сохранение всей модели не сохраняет состояние обратного вызова. Сейчас я использую Tensorflow 2.0. Результаты могут отличаться для разных версий. Я бы провел этот эксперимент на вашей версии и посмотрел, будет ли она вести себя аналогично.

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

Есть одна оговорка: вы должны не забыть создать обратный вызов за пределами вызова, чтобы он подходил. То есть сделать так:

checkpoint_callback = keras.callbacks.ModelCheckpoint(
    "checkpoint.h5", save_best_only=True)

model.fit(..., callbacks=checkpoint_callback)
...
model.fit(..., callbacks=checkpoint_callback)

не это:

model.fit(..., callbacks=keras.callbacks.ModelCheckpoint(
                   "checkpoint.h5", save_best_only=True))
...
model.fit(..., callbacks=keras.callbacks.ModelCheckpoint(
                   "checkpoint.h5", save_best_only=True))

Объект обратного вызова контрольной точки имеет атрибут best, который хранит наилучшее отслеживаемое значение на данный момент (и изначально устанавливается на наихудшее возможное значение, например, infinity, если меньше — хорошо). Это не сбрасывается, когда объект передается fit. Однако, если вы создаете экземпляр нового объекта обратного вызова в вызове fit, как в последнем коде, естественно best будет инициализировано наихудшим возможным значением, а не лучшим отслеживаемым значением, сохраненным другими объектами обратного вызова в предыдущих вызовах fit.

Другие вопросы по теме