在培训期间更换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时,它似乎从零开始训练。