python - 如何使用 LearningRateScheduler 选择最佳学习率和优化器
问题描述
我从 Coursera 课程中知道 LearningRateScheduler,但是以相同的方式复制它会导致模型性能不佳。也许是由于我设置的范围。Keras 网站的说明是有限的。
def duo_LSTM_model(X_train, y_train, X_test,y_test,num_classes,batch_size=68,units=128, learning_rate=0.005, epochs=20, dropout=0.2, recurrent_dropout=0.2 ):
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout,return_sequences=True)))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
model.add(Dense(num_classes, activation='softmax'))
adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
RMSopt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)
SGDopt = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9, decay=0.1, nesterov=False)
lr_schedule = tf.keras.callbacks.LearningRateScheduler(
lambda epoch: 1e-8 * 10**(epoch / 20))
model.compile(loss='binary_crossentropy',
optimizer=adamopt,
metrics=['accuracy'])
history = model.fit(X_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(X_test, y_test),
verbose=1,
callbacks=[lr_schedule])
score, acc = model.evaluate(X_test, y_test,
batch_size=batch_size)
yhat = model.predict(X_test)
return history, that
我有两个问题。
这是如何
1e-8 * 10**(epoch / 20)
工作的?我们应该如何选择 3 种不同优化器的范围?
解决方案
在回答您帖子中的两个问题之前,让我们首先澄清LearningRateScheduler
不是为了选择“最佳”学习率。
我认为您真正想问的是“如何确定最佳初始学习率”。如果我是正确的,那么您需要了解超参数调整。
回答 Q1:
为了回答如何1e-8 * 10**(epoch / 20)
工作,让我们创建一个简单的回归任务
import tensorflow as tf
import tensorflow.keras.backend as K
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input,Dense
x = np.linspace(0,100,1000)
y = np.sin(x) + x**2
x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.3)
input_x = Input(shape=(1,))
y = Dense(10,activation='relu')(input_x)
y = Dense(1,activation='relu')(y)
model = Model(inputs=input_x,outputs=y)
adamopt = tf.keras.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
def schedule_func(epoch):
print()
print('calling lr_scheduler on epoch %i' % epoch)
print('current learning rate %.8f' % K.eval(model.optimizer.lr))
print('returned value %.8f' % (1e-8 * 10**(epoch / 20)))
return 1e-8 * 10**(epoch / 20)
lr_schedule = tf.keras.callbacks.LearningRateScheduler(schedule_func)
model.compile(loss='mse',optimizer=adamopt,metrics=['mae'])
history = model.fit(x_train,y_train,
batch_size=8,
epochs=10,
validation_data=(x_val, y_val),
verbose=1,
callbacks=[lr_schedule])
在上面的脚本中,我没有使用lambda
函数,而是编写了一个函数schedule_func
。运行脚本,你会看到1e-8 * 10**(epoch / 20)
刚刚为每个 设置了学习率epoch
,并且学习率在增加。
回答 Q2:
例如,有很多不错的帖子
推荐阅读
- c# - 使用 c# 计算开始和停止时钟的总计数
- ios - 如何使用 SwiftUI 绘制圆弧?
- jenkins - 在 Jenkins 中,是否可以使用类别进行参数选择?
- javascript - 试图在javascript中将对象数组转换为对象
- ansible - ARM 模板部署对已经运行的 MemSQL 实例的影响
- android - "by navArgs 和有什么区别
()" vs "ScoreFragmentArgs.fromBundle(arguments!!)" - graph-databases - 涉及边缘属性数量检查的 gremlin 查询
- javascript - 如何在纯 JavaScript 中实现加载更多按钮功能?
- python - 制作闪烁的图像
- angular - 如何收听来自角度组件的服务中的http调用?