Перезагрузите лучшие веса с контрольных точек Tensorflow Keras

#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. Рад помочь. 🙂