在培训期间更换keras中的优化器
我正在使用在培训期间更换keras中的优化器,keras,Keras,我正在使用nadam优化器开发一个模型。我想知道,如果验证丢失在两个时期内都没有减少,是否有办法在培训期间切换到sgd。您可以创建一个提前停止回调来停止培训,在这个回调中,您可以创建一个函数来更改优化器并重新适应 以下回调将监视验证丢失(val\u loss)并在两个时段(patience)后停止训练,但改善程度不超过min\u delta min_delta = 0.000000000001 stopper = EarlyStopping(monitor='val_loss',min_del
nadam
优化器开发一个模型。我想知道,如果验证丢失在两个时期内都没有减少,是否有办法在培训期间切换到sgd
。您可以创建一个提前停止
回调来停止培训,在这个回调中,您可以创建一个函数来更改优化器并重新适应
以下回调将监视验证丢失(val\u loss
)并在两个时段(patience
)后停止训练,但改善程度不超过min\u delta
min_delta = 0.000000000001
stopper = EarlyStopping(monitor='val_loss',min_delta=min_delta,patience=2)
但是,为了在培训结束后添加额外的操作,我们可以扩展此回调并更改\u train\u end上的方法:
class OptimizerChanger(EarlyStopping):
def __init__(self, on_train_end, **kwargs):
self.do_on_train_end = on_train_end
super(OptimizerChanger,self).__init__(**kwargs)
def on_train_end(self, logs=None):
super(OptimizerChanger,self).on_train_end(self,logs)
self.do_on_train_end()
对于模型结束训练时要调用的自定义函数:
def do_after_training():
#warining, this creates a new optimizer and,
#at the beginning, it might give you a worse training performance than before
model.compile(optimizer = 'SGD', loss=...., metrics = ...)
model.fit(.....)
现在让我们使用回调:
changer = OptimizerChanger(on_train_end= do_after_training,
monitor='val_loss',
min_delta=min_delta,
patience=2)
model.fit(..., ..., callbacks = [changer])
你喜欢这个工作吗
model.compile( optimizer='Adam', ...)
model.fit( X, y, epochs=100, callback=[EarlyStoppingCallback] )
# now switch to SGD and finish training
model.compile( optimizer='SGD', ...)
model.fit( X, y, epochs=10 )
或者第二次调用compile会覆盖所有变量(例如,执行类似于tf.initialize_all_variables()的操作)
(这实际上是一个后续问题-但我写这篇文章是为了回答-因为stackoverflow不允许在注释中使用代码)我这样做了,它成功了
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs):
self.model.optimizer = new_model_optimizer
self.model.loss = new_model_loss
重新编译模型不会改变其权重——不幸的是,当您在重新编译后调用fit时,它似乎从零开始训练。