mrg*_*oom 6 python keras tensorflow
如何在 keras 中重置优化器状态?
查看优化器类我看不到这样的方法:https : //github.com/keras-team/keras/blob/613aeff37a721450d94906df1a3f3cc51e2299d4/keras/optimizers.py#L60
还有什么是实际self.updates和self.weights?
没有一种“简单”的方法来重置“状态”,但您始终可以使用新的优化器简单地重新编译模型(保留模型的权重):
newOptimizer = Adadelta()
model.compile(optimizer=newOptimizer)
Run Code Online (Sandbox Code Playgroud)
set_weights(weightsListInNumpy)您还可以在基类中使用该方法(不推荐) Optimizer,但这会相当麻烦,因为您需要知道所有初始值和形状,有时可能不是微不足道的零。
现在,该属性self.weights没有做太多事情,但是保存和加载优化器的函数将保存和加载该属性。它是张量列表,不应直接更改。最多K.set_value(...)在列表的每个条目中使用。您可以在方法weights中看到保存优化器。_serialize_model
这些self.updates东西理解起来有点复杂。它存储将在训练中模型处理的每个批次中更新的变量。但它是一个符号图变量。
正如self.updates您在代码中看到的, 始终附加有K.update(var, value)或K.update_add(var, value)。这是告诉图表这些值应该在每次迭代时更新的正确方法。
通常,更新的变量是iterations, params(模型的权重), moments,accumulators等。
Flo*_*n H -1
优化器只是调整模型的宽度,因此信息存储在模型中,而不是优化器中。
这意味着您无法以您想象的方式重置优化器。您需要重置(或者可能更简单,重新创建)您的模型。
这意味着您还可以使用优化器 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)
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,您可以使用学习率 5 训练 10 个 epoch,使用新的优化器编译模型,然后继续使用学习率 0.5 进行另外 10 个 epoch。如果您再次编译模型,您也可以称为训练进度的权重不会丢失。