Если у меня есть модель Keras, оснащенная обратным вызовом ModelCheckpoint
, и я подгоняю ее за несколько «сеансов подгонки» (т. е. я вызываю model.fit()
несколько раз), будет ли обратный вызов сохранять лучшую модель в самом последнем сеансе подгонки или лучшую модель из всех подгонок? сессии?
Спасибо.
Он сохранит лучшую модель из последней примерки.
Неправильно, модель сохранится только в том случае, если она будет лучшей из всех сеансов подгонки, если вы создадите только один объект обратного вызова (вне вызова fit
).
Это сохранит модель напоследок 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
.
Пожалуйста, попробуйте добавить некоторые фрагменты того, что вы пробовали