【问题标题】:Keras: how to reset optimizer state?Keras:如何重置优化器状态?
【发布时间】:2019-06-28 11:49:53
【问题描述】:

如何在 keras 中重置优化器状态?

查看优化器类我看不到这样的方法: https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L60

self.updatesself.weights 究竟是什么?

【问题讨论】:

  • 这确实不是一个简单的任务! ML 应该很难,不是吗,亲爱的 TF 团队?与此问题相关的优化器的一个流行用例是从检查点保存/加载它们。此用例的解决方法是不保存它们。为此有一个特殊的标志:model.save(... , include_optimizer=False)!

标签: python tensorflow keras


【解决方案1】:

重置“状态”没有“简单”的方法,但您始终可以使用新的优化器重新编译模型(保留模型的权重):

newOptimizer = Adadelta()
model.compile(optimizer=newOptimizer)     

您也可以在基类Optimizer 中使用方法set_weights(weightsListInNumpy)(不推荐),但这会相当麻烦,因为您需要知道所有初始值和形状,有时可能不是微不足道的零.

现在,self.weights 属性并没有多大作用,但是保存和加载优化器的函数会保存和加载这个属性。这是张量列表,不应直接更改。最多在列表的每个条目中使用K.set_value(...)。在_serialize_model method中保存优化器可以看到weights

self.updates 的理解有点复杂。它存储将随着模型在训练中处理的每个批次更新的变量。但它是一个符号图形变量。

正如您在代码中看到的那样,self.updates 始终附加有 K.update(var, value)K.update_add(var, value)。这是告诉图形应该在每次迭代中更新这些值的正确方法。

通常,更新后的变量为iterationsparams(模型的权重)、momentsaccumulators 等。

【讨论】:

    【解决方案2】:

    我认为没有通用的方法,但您应该能够通过初始化保存优化器的变量来重置优化器的状态。不过,这需要使用 TensorFlow API 来完成。状态变量取决于特定类型的优化器。例如,如果您有一个 Adam 优化器 (source),您可以执行以下操作:

    from keras.optimizers import Adam
    from keras import backend as K
    
    optimizer = Adam(...)
    # These depend on the optimizer class
    optimizer_state = [optimizer.iterations, optimizer.lr, optimizer.beta_1,
                       optimizer.beta_2, optimizer.decay]
    optimizer_reset = tf.variables_initializer(optimizer_state)
    
    # Later when you want to reset the optimizer
    K.get_session().run(optimizer_reset)
    

    【讨论】:

      【解决方案3】:

      优化器只是调整模型的细节,因此信息存储在模型中,而不是优化器中。

      这意味着您无法以您可能认为的方式重置优化器。您需要重置(或者更简单,重新创建)您的模型。

      这意味着您还可以使用优化器 A 优化您的模型,在一些 epoch 后停止,然后继续使用优化器 B 优化您的模型,而不会丢失优化器 A 已经完成的进度。

      我不知道self.updatesself.weights 到底是干什么用的。但是因为这些是类的内部变量,所以有人需要了解/阅读优化器类本身并理解其代码。在这里,我们需要等待更深入地研究 keras 源代码的人。

      编辑

      您可以重新创建优化器,例如:

      model = Seqeuential()
      ...
      ...
      ...
      
      model.compile(optimizer=keras.optimizers.Adadelta(lr = 5, loss='mean_squared_error')
      model.fit(X, y, epochs=10)
      
      model.compile(optimizer=keras.optimizers.Adadelta(lr = 0.5, loss='mean_squared_error')
      model.fit(X, y, epochs=10)
      

      使用上面的代码,您以 5 的学习率训练 10 个 epoch,使用新的优化器编译您的模型,然后以 0.5 的学习率再继续 10 个 epoch。如果你再次编译你的模型,你也可以称之为训练进度的权重不会丢失。

      【讨论】:

      • 我不想重置模型权重我只想重置优化器状态,​​即优化器参数(lr 等)
      • 许多优化器包含自己的信息,例如梯度的移动平均值或单个参数的学习率。重置优化器会丢弃这些信息,并可能导致性能下降(至少在短期内,直到优化器重新学习移动平均值、个体学习率等)。
      猜你喜欢
      • 1970-01-01
      • 2017-10-08
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多