keras通过callback根据epoch自定义修改学习率以及根据loss停止训练

直接放上代码

from tensorflow.keras.callbacks import LearningRateScheduler, Callback

class EarlyStoppingByLossVal(Callback):
    def __init__(self, monitor='val_loss', value=0.00001, verbose=0):
        super(Callback, self).__init__()
        self.monitor = monitor
        self.value = value
        self.verbose = verbose

    def on_epoch_end(self, epoch, logs={}):
        current = logs.get(self.monitor)
        if current is None:
            warnings.warn("Early stopping requires %s available!" % self.monitor, RuntimeWarning)

        if current < self.value:
            if self.verbose > 0:
                print("Epoch %05d: early stopping THR" % epoch)
            self.model.stop_training = True




def step_decay(epoch, lr):
    # initial_lrate = 1.0 # no longer needed
    boundaries = [10,20] # 为不同的epoch范围设置不同的学习率
    values = [100.0, 0.0, 0.1]
    for idx,bd in enumerate(boundaries):
        if (epoch+1)<bd:
            lr = values[idx]
            print(epoch, lr)
            return lr
    print(epoch)
    return values[-1]
	
	

callbacks = [
    EarlyStoppingByLossVal(monitor='val_loss', value=0.3, verbose=1),
    LearningRateScheduler(step_decay),
]
adam = optimizers.Adam(learning_rate=0.01, decay=1e-6)
model.compile(optimizer=adam, loss='mean_squared_error')
model.fit(x_train, y_train, epochs=60, batch_size=bs, shuffle=False, verbose=1, validation_data=(x_test, y_test), callbacks=callbacks)

下面是调试结果

 

根据代码, 结果应该在第10个epoch(实际epoch==9)的时候,学习率变为0, 而在第20个poch(实际epoch==19)的时候,学习率变为0.1.  前面1个正确,不知道为啥后面1个不对???
EarlyStoppingByLossVal是根据传入的监视变量的大小, 来判断是否终止训练.
代码参考这里这里.




 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值