如何通过遵循全局步骤在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
根本不会改变学习率,因为在ep
,epoch=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学习率指数分段逆时间多项式衰减及自定义学习率衰减的完整实例