#python-3.x #tensorflow #machine-learning #keras #deep-learning
Вопрос:
Есть ли способ перезагрузить веса из определенной эпохи или лучшие веса из файлов контрольных точек модели, созданных ModelCheckpoint
после завершения обучения?
Я тренировал это в течение 10 эпох и создал контрольную точку, которая сохраняла веса только после каждой эпохи. val_categorical_accuracy последней эпохи немного ниже, чем у эпохи № 5. Я знаю, что должен был установить save_best_only=True
, но я пропустил это.
- Итак, теперь, есть ли способ получить веса из лучшей эпохи или эпохи номер 5?
- Кроме того,
ModelCheckpoint
перезаписывает ли веса после каждой эпохи в файле контрольной точки?
Каковы мои варианты здесь? Заранее спасибо за вашу помощь.
Ниже приведена моя реализация:
checkpoint_path = 'saved_model/cp.ckpt'
checkpoint_dir = os.path.dirname(checkpoint_path)
print(checkpoint_dir)
lstm_model.fit(X_train_seq_pad, y_train_cat,
epochs=100,
validation_data=(X_val_seq_pad, y_val_cat),
callbacks=[callbacks.EarlyStopping(monitor='val_loss', patience=3),
callbacks.ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
verbose=1)])
Ответ №1:
Если filepath
не содержит параметров форматирования, как {epoch}
тогда filepath
, будет перезаписываться каждой новой лучшей моделью. В вашем случае именно поэтому вы не можете получить вес в определенную эпоху (например, эпоха 5).
Однако здесь вы можете выбрать опцию форматирования в ModelCheckpoint
обратном вызове во время обучения. Такие как
tf.keras.callbacks.ModelCheckpoint(
filepath='model.{epoch:02d}-{val_loss:.4f}.h5',
save_freq='epoch', verbose=1, monitor='val_loss',
save_weights_only=True, save_best_only=False
)
Это позволит сохранить вес модели (в .h5
формате) в каждую эпоху по-разному, но удобным способом. Кроме того, если мы решим save_best_only
True
, это таким же образом сэкономит лучшие веса.
Пример кода
Вот один из сквозных рабочих примеров для справки. Мы будем сохранять веса моделей в каждую эпоху удобным способом с возможностью форматирования, в котором мы определим filepath
параметр следующим образом:
img = tf.random.normal([20, 32], 0, 1, tf.float32)
tar = np.random.randint(2, size=(20, 1))
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim = 32, activation= 'relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
callback_list = [
tf.keras.callbacks.ModelCheckpoint(
filepath='model.{epoch:02d}-{val_loss:.4f}.h5',
save_freq='epoch', verbose=1, monitor='val_loss',
save_weights_only=True, save_best_only=False
)
]
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(img, tar, epochs=5, verbose=2, validation_split=0.2,
callbacks=callback_list)
Это позволит экономить вес модели в каждую эпоху. И я найду каждый вес на своем локальном диске.
# model.epoch_number_score.h5
model.01-0.8022.h5
model.02-0.8014.h5
model.03-0.8005.h5
model.04-0.7997.h5
model.05-0.7989.h5
Однако обратите внимание, что я использовал save_best_only = False
, но если мы установим это значение True
, вы получите только лучший вес таким же образом. Что-то вроде этого:
# model.epoch_number_score.h5
model.01-0.8022.h5
model.03-0.8005.h5
model.05-0.7989.h5
Комментарии:
1. Эй, большое спасибо за четкое объяснение. Да, я понял, что
ModelCheckpoint
это приведет к перезаписи весов после прочтения документа, поэтому предоставление схемы именования-хороший способ обойти ее и сохранить историю обученных весов. Это было очень полезно, и мне понравилась схема именования, которую вы предложили здесь.2. Рад помочь. 🙂