为什么在Keras中Adam.iterations总是设置为0?

时间:2019-07-02 11:18:38

标签: python tensorflow machine-learning optimization keras

我目前正在尝试通过keras / tensorflow进入神经网络构建并解决一些示例问题。目前,我尝试了解如何通过model.save()/。load()正确保存和加载当前模型。我希望,如果一切都正确设置,加载一个预先训练的模型并继续训练,就不会破坏我以前的准确性,而只是继续我刚离开的地方。

但是,不是。在加载模型后,我的精度开始出现较大波动,需要一段时间才能真正恢复到以前的精度:

首次运行

enter image description here

继续运行

enter image description here

在深入探讨了各种可能的解释之后(没有一个适用于我的发现),我认为我想出了原因:

<罢工> 我使用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”参数设置为保存模型的实际历元号,我的模型也将始终以初始的“大”学习率重新启动。 )。

所以我的问题是:

  • 这是预期的行为吗?
  • 如果是这样,这与keras常见问题解答中引用的那句model.save()“重新开始您刚离开的地方进行训练”相符吗?
  • 有没有一种方法可以真正保存和恢复Adam优化器,包括迭代计数器,而无需编写自己的优化器(我已经发现这是一个可能的解决方案,但我想知道是否真的没有更简单的方法)

修改 我找到了原因/解决方案:我在load_model之后调用了model.compile,这会在保持权重的同时重置优化器(另请参见Does model.compile() initialize all the weights and biases in Keras (tensorflow backend)?

1 个答案:

答案 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/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L742

https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L103

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/optimizers.py