1、前言
学习率的设置对神经网络的训练很重要,一般都会在训练的前期用大的学习率,随着网络的迭代,逐渐减小学习率。
此处介绍了3中自定义学习率的方法。
2、代码
import tensorflow as tf
def lrfn(epoch, init_lr=0.05, attenuation_rate=0.5, attenuation_step=5):
lr = init_lr
lr = lr * attenuation_rate**(epoch//attenuation_step)
return lr
class Mylearning_rate():
def __init__(self):
pass
# 等同于上面的 lrfn
def fixed_step_attenuation(self,
epoch,
init_lr=0.05,
attenuation_rate=0.5,
attenuation_step=5):
''' Fixed step size decay
:param epoch: 当前epoch
:param init_lr: 初始学习率
:param attenuation_rate: 衰减率
:param attenuation_step: 衰减步长
:return: init_lr * attenuation_rate**(epoch//attenuation_step)
'''
lr = init_lr
lr = lr * attenuation_rate ** (epoch // attenuation_step)
return lr
def exponential_attenuation(self, epoch):
# 指数衰减
if epoch < 10:
return 0.001
else:
return 0.001 * tf.math.exp(0.1 * (10 - epoch))
def cos_attenuation(self, epoch, init_lr=0.05, period = 10):
'''
:param epoch: 当前epoch
:param init_lr: 初始学习率
:param period: 几步长衰减到0
:return:
'''
num = 2 / init_lr
lr = (tf.math.cos(epoch*3/period) + 1) / num
if lr <0:
raise ValueError('The learning rate is less than 0')
return lr
3、使用
在使用时。首先调用tf.keras.callbacks.LearningRateScheduler
learning_rate = Mylearning_rate()
lr_callback = tf.keras.callbacks.LearningRateScheduler(
learning_rate.fixed_step_attenuation, verbose=True)
然后在fit函数中
使用callbacks
参数
model.fit( callbacks=[lr_callback] )
这样就可以在训练过程中自动改变学习率。