如何在keras中重置优化器状态?
看着Optimizer类,我看不到这样的方法: https://github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L60
还有self.updates
和self.weights
实际上是什么?
答案 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)
。这是告诉图形这些值应在每次迭代时更新的正确方法。
通常,更新后的变量为iterations
,params
(模型的权重),moments
,accumulators
等。
答案 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.updates
和self.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个时期。如果您再次编译模型,您也可以称其为训练进度的权重不会丢失。