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

问题描述 投票:2回答:1

请看下面的例子

# 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的每次迭代中获得学习率。

neural-network keras deep-learning reinforcement-learning
1个回答
2
投票

你实际上可以将两个参数传递给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
© www.soinside.com 2019 - 2024. All rights reserved.