假设您有一个Keras模型,其中包含您通过save_model
保存的Adam等优化器。
如果使用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()},
,例如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}
因此,这只保存基本参数,但不保存每变量优化器权重。
但是,在config
中转储save_model
之后,看起来也会保存一些优化程序权重(Link)。不幸的是,如果优化器的每个重量都保存下来,我真的无法理解。
因此,如果您想继续在load_model
的新会话中训练模型,优化程序的状态是否与上次训练会话中的状态完全相同?例如。在SGD有动力的情况下,它是否会保存所有的每变量动量?
或者一般来说,如果您使用save/load_model
停止并恢复培训会对培训产生影响吗?
答案 0 :(得分:4)
看起来你的链接不再指向你问题时最初指向的相同行,所以我不知道你指的是哪一行。
但答案是肯定的,优化器的整个状态与模型一起保存。您可以在save_model()中看到这种情况。此外,如果您不想保存优化程序权重,可以通过调用save_model(include_optimizer=False)
来完成。
如果您检查生成的* .h5文件,例如通过h5dump | less
,您可以看到这些权重。 (h5dump是h5utils的一部分。)
因此,保存模型并在以后再次加载它应该在许多常见情况下没有区别。但是,有一些与优化程序无关的例外情况。我现在想到的是一个LSTM(stateful=True)
层,我相信在调用save_model()
时不会保存内部LSTM状态。使用保存/加载中断训练可能不会产生与不中断训练完全相同的结果可能有更多的原因。但调查这一点可能只有在具体代码的背景下才有意义。