注:我目前只在时间序列预测的问题中见过这种操作。别的场景不确定是否可用。欢迎大家补充啊。
在我训练模型的过程中,我经常不知该如何确定学习率,因为学习率的大小直接会影响到模型训练的精度的结果,因此我们可以用tf.keras.callbacks中的一个叫lr_schedule的学习率控制器,他可以帮助我们确定最优学习率的大概的范围。
例如,在一个有序序列的预测范例中,使用这种方法来确定大致最优的学习率所在的范围:
下面展示一些 内联代码片
。
model = tf.keras.models.Sequential([
tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1),
input_shape=[None])
# 若return_sequences设为true,那么每一个神经元的运算结果都将输出到下一层
# 若为false,则只输出最后一个神经元的结果
tf.keras.layers.SimpleRNN(40, return_sequences=True),
tf.keras.layers.SimpleRNN(40),
tf.keras.layers.Dense(1),
tf.keras.layers.Lambda(lambda x: x * 100.0)
])
# callbacks的一个参数,学习率的控制,为了寻找当损失函数最低时对应的学习率
lr_schedule = tf.keras.callbacks.LearningRateScheduler(
lambda epoch: 1e-8 * 10**(epoch / 20))
optimizer = tf.keras.optimizers.SGD(lr=1e-8, momentum=0.9)
# 这里有了一个新的损失函数出现
model.compile(loss=tf.keras.losses.Huber(),
optimizer=optimizer,
metrics=["mae"])
# 训练大概100个epochs,可以得到一个学习率与损失的曲线图
history = model.fit(train_set, epochs=100, callbacks=[lr_schedule])
之后打印出图像
plt.semilogx(history.history["lr"], history.history["loss"])
plt.axis([1e-8, 1e-4, 0, 30])
由图可知,最佳的范围大概在红圈之内,因此我们可以折中取一个5*10^(-5),之后以这个学习率为准训练即可。