我目前正在尝试通过keras / tensorflow进入神经网络构建并解决一些示例问题。目前,我尝试了解如何通过model.save()/。load()正确保存和加载当前模型。我希望,如果一切都正确设置,加载一个预先训练的模型并继续训练,就不会破坏我以前的准确性,而只是继续我刚离开的地方。
但是,不是。在加载模型后,我的精度开始出现较大波动,需要一段时间才能真正恢复到以前的精度:
首次运行
继续运行
在深入探讨了各种可能的解释之后(没有一个适用于我的发现),我认为我想出了原因:
<罢工> 我使用tf.keras.optimizers.Adam进行重量优化,并检查了其初始化程序
def __init__(self, [...], **kwargs):
super(Adam, self).__init__(**kwargs)
with K.name_scope(self.__class__.__name__):
self.iterations = K.variable(0, dtype='int64', name='iterations')
[...]
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,
'amsgrad': self.amsgrad
}
当将整个模型保存为配置字典的一部分时,似乎“迭代”计数器始终重置为0,并且既不存储也不加载其当前值。这似乎与model.save保存“ “优化程序的状态,允许您从上次中断的位置继续进行精确训练”的说法相矛盾。(https://keras.io/getting-started/faq/)。由于迭代计数器是一种控制亚当算法中学习率指数“下降”的计数器
1. / (1. + self.decay * math_ops.cast(self.iterations,
K.dtype(self.decay))))
即使我将model.fit()中的“ initial_epoch”参数设置为保存模型的实际历元号,我的模型也将始终以初始的“大”学习率重新启动。 )。
所以我的问题是:
修改 我找到了原因/解决方案:我在load_model之后调用了model.compile,这会在保持权重的同时重置优化器(另请参见Does model.compile() initialize all the weights and biases in Keras (tensorflow backend)?)
答案 0 :(得分:0)
如下面的代码片段所示,iterations
的值已恢复。
model.save('dense_adam_keras.h5')
mdl = load_model('dense_adam_keras.h5')
print('iterations is ', K.get_session().run(mdl.optimizer.iterations))
iterations is 46
调用“ load_model
”时,将调用deserialize
方法来创建优化器对象,然后调用set_weights
方法以从保存的权重中恢复优化器状态。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/optimizers.py