【问题标题】:Reload best weights from Tensorflow Keras Checkpoints从 Tensorflow Keras 检查点重新加载最佳权重
【发布时间】:2021-08-16 20:24:42
【问题描述】:

有没有办法在训练结束后重新加载某个时期的权重或 ModelCheckpoint 创建的模型检查点文件中的最佳权重?

我已经训练了 10 个 epoch 并创建了一个检查点,它只在每个 epoch 之后保存权重。最终 epoch 的 val_categorical_accuracy 略低于 epoch no。 5. 我知道我应该设置save_best_only=True,但我错过了。

  • 那么现在,有没有办法从最佳时期或时期号 5 中获取权重?
  • 另外,ModelCheckpoint 会在每个 epoch 之后覆盖权重吗? 检查点文件?

我在这里有什么选择?提前感谢您的帮助。

下面是我的实现:

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)])

【问题讨论】:

    标签: python-3.x tensorflow machine-learning keras deep-learning


    【解决方案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_onlyTrue,它将以相同的方式保存最佳权重。


    代码示例

    这是一个端到端工作示例供参考。我们将使用格式化选项以方便的方式保存每个 epoch 的模型权重,我们将定义 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)
    

    它将在每个 epoch 保存模型权重。我会在我的本地磁盘中找到所有重量。

    # 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
    

    【讨论】:

    • 嘿,非常感谢您的清晰解释。是的,我意识到ModelCheckpoint 将在阅读文档后覆盖权重,因此提供命名模式是绕过它并保留训练权重历史的好方法。这很有帮助,我喜欢你在这里建议的命名模式。
    • 很高兴为您提供帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多