Keras:save_model真的保存了所有优化器权重吗?

0vb*_*vbb 9 keras

假设您有一个Keras模型,其中包含您通过Adam保存的优化器save_model.如果再次加载模型load_model,它是否真的加载所有优化器参数+权重?


根据save_model(Link)的代码,Keras保存优化器的配置:

f.attrs['training_config'] = json.dumps({
                             'optimizer_config': {
                             'class_name': model.optimizer.__class__.__name__,
                             'config': model.optimizer.get_config()},
Run Code Online (Sandbox Code Playgroud)

例如,在Adam的情况下(Link),如下:

def get_config(self):
    config = {'lr': float(K.get_value(self.lr)),
              'beta_1': float(K.get_value(self.beta_1)),
              'beta_2': float(K.get_value(self.beta_2)),
              'decay': float(K.get_value(self.decay)),
              'epsilon': self.epsilon}
Run Code Online (Sandbox Code Playgroud)

因此,这仅保存基本参数,但不保存每变量优化器权重.

然而,倾倒后configsave_model,它看起来像一些优化权重被保存为好(链接).不幸的是,如果优化器的每个重量都保存下来,我真的无法理解.


因此,如果您想继续在新会话中训练模型,load_model优化器的状态是否真的与上次培训会话中的100%相同?例如,在具有动量的SGD的情况下,它是否保存所有每变量动量?

或者一般来说,如果你停止并恢复训练,它是否会对训练产生影响save/load_model

jlh*_*jlh 5

看来您的链接不再指向与您在提出问题时最初指向的行相同的行,因此我不知道您指的是哪几行。

但是答案是肯定的,优化器的整个状态与模型一起保存。您可以在save_model()中看到这种情况。另外,如果您不想节省优化程序权重,则可以通过调用来实现save_model(include_optimizer=False)

如果检查生成的* .h5文件(例如通过)h5dump | less,则可以看到这些权重。(h5dump是的一部分h5utils。)

因此,在许多常见情况下,保存模型并在以后再次加载该模型应该没有任何区别。但是,存在与优化程序无关的例外。我现在想到的是LSTM(stateful=True)一层,我相信在调用时不会保存内部LSTM状态save_model()。可能还有更多的原因为什么用保存/加载中断训练可能无法产生与不中断训练完全相同的结果。但是,仅在具体代码的上下文中进行调查可能才有意义。