【问题标题】:How to reset optimizer state from loaded checkpoint如何从加载的检查点重置优化器状态
【发布时间】:2021-07-01 17:41:49
【问题描述】:

我使用 ModelCheckpoint 回调使用 save_weights_only 选项保存了一个模型

checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
            'path.ckpt, save_weights_only=True)

然后,当我想对较小的数据集进行微调时,我将其重新加载:

ckpt = tf.train.Checkpoint(model)
ckpt.restore(checkpoint_path).expect_partial()

我用新的优化器重新编译了模型:

class CFG:
    _scheduler = tf.keras.optimizers.schedules.ExponentialDecay(
        initial_learning_rate=lr, decay_rate=decay_rate)
    scheduler = WarmUp(
        initial_learning_rate=lr, decay_schedule_fn=_scheduler,
        warmup_steps=warmup_steps)
    optimizer = tfa.optimizers.AdamW(
        weight_decay=1e-4, learning_rate=scheduler, epsilon=1e-8)

model.compile(
    optimizer=CFG.optimizer,
)

但优化器不知何故仍停留在之前衰减的 lr 上,而不是设置为我现在想要的更高的 lr,而且我不确定其他优化器参数。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    问题可能是因为您使用的是类属性而不是实例属性。

    修复:

    class CFG:
      def __init__(self,lr,decay_rate,warmup_steps):
        _scheduler = tf.keras.optimizers.schedules.ExponentialDecay(
            initial_learning_rate=lr, decay_rate=decay_rate)
        scheduler = WarmUp(
            initial_learning_rate=lr, decay_schedule_fn=_scheduler,
            warmup_steps=warmup_steps)
        self.optimizer = tfa.optimizers.AdamW(
            weight_decay=1e-4, learning_rate=scheduler, epsilon=1e-8)
    
    new_CFG=CFG(lr,decay_rate,warmup_steps)
    model.compile(
        optimizer=new_CFG.optimizer,
    )
    

    【讨论】:

    • 不错的尝试,可惜没有雪茄
    • 我最终只是放弃了调度程序,问题就消失了。 (并非微不足道,因为调度程序仍参与预训练 - 所以我不知道如何/为什么满足它)
    • 除非model.compile 行在ckpt.restore 之前,否则我无法重现您的错误。这意味着您必须确保 model.compileckpt.restore 之后,并且还初始化了一个新的优化器,就像我在答案中所做的那样。您也可以提供WarmUp的代码。
    • 感谢您的调查。我有这些东西的顺序。 Warmup 看起来像这样:stackoverflow.com/a/65198840/4391249
    • 说实话,我的脏修复现在已经足够好了。
    猜你喜欢
    • 1970-01-01
    • 2019-11-10
    • 2018-09-05
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多