繁体   English   中英

Keras:如何重置优化器状态?

[英]Keras: how to reset optimizer state?

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

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

还有什么是self.updatesself.weights

没有一种“简单”的方法来重置“状态”,但您总是可以简单地使用新的优化器重新编译您的模型(模型的权重被保留):

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

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

现在,属性self.weights没有做太多事情,但是保存和加载优化器的函数将保存和加载这个属性。 这是张量列表,不应直接更改。 最多在列表的每个条目中使用K.set_value(...) 您可以在_serialize_model方法中查看保存优化器的weights

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

self.updates ,你可以在代码中看到,总是与附加K.update(var, value)K.update_add(var, value) 这是告诉图形应该在每次迭代中更新这些值的正确方法。

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

我不认为有一个通用的方法,但是您应该能够通过初始化保存优化器的变量来重置优化器的状态。 不过,这需要使用 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)

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

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

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

我不知道self.updatesself.weights到底是self.updates用的。 但是因为这些是类的内部变量,所以有人需要了解/阅读优化器类本身并理解其代码。 在这里,我们需要等待深入研究 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 个时期,使用新的优化器编译您的模型,然后继续以学习率 0.5 进行另外 10 个时期。 如果您再次编译模型,您也可以称之为训练进度的权重不会丢失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM