如何通过遵循全局步骤在Keras中实现指数衰减学习率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过遵循全局步骤在Keras中实现指数衰减学习率相关的知识,希望对你有一定的参考价值。

请看下面的例子

# encoding: utf-8
import numpy as np
import pandas as pd
import random
import math
from keras import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam, RMSprop
from keras.callbacks import LearningRateScheduler

X = [i*0.05 for i in range(100)]

def step_decay(epoch):
    initial_lrate = 1.0
    drop = 0.5
    epochs_drop = 2.0
    lrate = initial_lrate * math.pow(drop, 
    math.floor((1+epoch)/epochs_drop))
    return lrate

def build_model():
    model = Sequential()
    model.add(Dense(32, input_shape=(1,), activation='relu'))
    model.add(Dense(1, activation='linear'))
    adam = Adam(lr=0.5)
    model.compile(loss='mse', optimizer=adam)
    return model

model = build_model()
lrate = LearningRateScheduler(step_decay)
callback_list = [lrate]

for ep in range(20):
    X_train = np.array(random.sample(X, 10))
    y_train = np.sin(X_train)
    X_train = np.reshape(X_train, (-1,1))
    y_train = np.reshape(y_train, (-1,1))
    model.fit(X_train, y_train, batch_size=2, callbacks=callback_list, 
              epochs=1, verbose=2)

在这个例子中,LearningRateSchedule根本不会改变学习率,因为在epepoch=1的每次迭代中。因此,学习率只是常数(1.0,根据step_decay)。事实上,不是直接设置epoch> 1,我必须做如示例中所示的外循环,并且内部每个循环,我只运行1个纪元。 (当我实施深度强化学习而不是监督学习时就是这种情况)。

我的问题是如何在我的例子中设置指数衰减学习率以及如何在ep的每次迭代中获得学习率。

答案

你实际上可以将两个参数传递给LearningRateScheduler。根据Keras documentation,调度程序是

将纪元索引作为输入(整数,从0索引)和当前学习速率的函数,并返回新的学习速率作为输出(浮点)。

所以,基本上,只需用函数参数替换你的initial_lr,如下:

def step_decay(epoch, lr):
    # initial_lrate = 1.0 # no longer needed
    drop = 0.5
    epochs_drop = 2.0
    lrate = lr * math.pow(drop, 
    math.floor((1+epoch)/epochs_drop))
    return lrate

以上是关于如何通过遵循全局步骤在Keras中实现指数衰减学习率的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow+Keras学习率指数分段逆时间多项式衰减及自定义学习率衰减的完整实例

如何在 keras 层中实现 GlobalMinPool2D 函数?

用示例学习 Keras

在 Keras 中实现模型。如何解释填充/步幅值?

在Android中实现亮度逐渐衰减的干净方法?

如何在 Keras 中实现 Salt&Pepper 层?