假设您有一个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)
因此,这仅保存基本参数,但不保存每变量优化器权重.
然而,倾倒后config的save_model,它看起来像一些优化权重被保存为好(链接).不幸的是,如果优化器的每个重量都保存下来,我真的无法理解.
因此,如果您想继续在新会话中训练模型,load_model优化器的状态是否真的与上次培训会话中的100%相同?例如,在具有动量的SGD的情况下,它是否保存所有每变量动量?
或者一般来说,如果你停止并恢复训练,它是否会对训练产生影响save/load_model?
看来您的链接不再指向与您在提出问题时最初指向的行相同的行,因此我不知道您指的是哪几行。
但是答案是肯定的,优化器的整个状态与模型一起保存。您可以在save_model()中看到这种情况。另外,如果您不想节省优化程序权重,则可以通过调用来实现save_model(include_optimizer=False)。
如果检查生成的* .h5文件(例如通过)h5dump | less,则可以看到这些权重。(h5dump是的一部分h5utils。)
因此,在许多常见情况下,保存模型并在以后再次加载该模型应该没有任何区别。但是,存在与优化程序无关的例外。我现在想到的是LSTM(stateful=True)一层,我相信在调用时不会保存内部LSTM状态save_model()。可能还有更多的原因为什么用保存/加载中断训练可能无法产生与不中断训练完全相同的结果。但是,仅在具体代码的上下文中进行调查可能才有意义。
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |