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

时间:2019-06-28 11:49:53

标签: python tensorflow keras

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

看着Optimizer类,我看不到这样的方法: https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L60

还有self.updatesself.weights实际上是什么?

3 个答案:

答案 0 :(得分:1)

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

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

您还可以在基类set_weights(weightsListInNumpy)中使用方法Optimizer(不建议使用),但这会很麻烦,因为您需要了解所有初始值和形状,有时可能不是零。

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

这意味着您还可以使用优化器A优化模型,在某些时期后停止,然后继续使用优化器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个时期,并使用新的优化器编译模型,然后再以0.5个学习速率继续进行10个时期。如果您再次编译模型,您也可以称其为训练进度的权重不会丢失。