恒定高学习率训练可能会发散,低学习率会收敛到最优解但是会花费大量时间
幂调度
指数调度
分段调度
性能调度
在创建优化器时,设置超参数decay
使用示例:
optimizer=keras.optimizers.SGD(lr=0.001,momentum=0.9,nesterov=True,decay=1e-4)
创建一个返回配置函数的函数
def exponential_decay(lr0,s):
def exponential_decay_fn(epoch):
return lr0 * 0.1 **(epoch/s)
return exponential_decay_fn
exponential_decay_fn=exponential_decay(lr0=0.01,s=20)
lr_scheduler= keras.callbacks.LearningRateScheduler(exponential_decay_fn)
使用示例:
history=model.fit(X_train,y_train,epochs=3,validation_split=0.1,callbacks=[lr_scheduler])
在fit函数中使用callbacks参数传入回调函数
回调函数是一个根据epoch的分段函数
连续一定轮次最好验证损失都没有改善的话它将使学习率乘以某个数
使用示例
lr_scheduler= keras.callbacks.ReduceLROnPlateau(factor=0.5,patience=5)
model.fit(.....,callbacks=[lr_scheduler])
tf.keras.callbacks.ReduceLROnPlateau(
monitor='val_loss',
factor=0.1,
patience=10,
verbose=0,
mode='auto',
min_delta=0.0001,
cooldown=0,
min_lr=0,
**kwargs
)
定义学习率,然后将学习率传递给任意优化器
使用之前的指数调度,示例如下
s=20 * len(X_train)
learning_rate= tf.optimizers.schedules.ExponentialDecay(0.01,s,0.1)
optimizer=keras.optimizers.SGD(learning_rate)
出错的代码:
learning_rate= tf.keras.optimizer.schedules.ExponentialDecay(0.01,s,0.1)
修改:
learning_rate= tf.optimizers.schedules.ExponentialDecay(0.01,s,0.1)
直接线上翻译(蟒蛇—>python)
keras.layers.Dense(300,activation='PReLU',
kernel_initializer='lecun_normal',
kernel_regularizer=keras.regularizers.l2(0.01))
使用重复的代码(往往会有相同的激活函数,初始化策略和正则化函数)可以使用functools.partial()
函数创建一个带有一些默认参数值的任何可调用对象创建一个小的包装函数
from functools import partial
RegularizedDense=partial(keras.layers.Dense,
activation = 'elu',
kernel_initializer="he_normal",
kernel_regularizer=keras.regularizers.l2(0.01))
模型建立示例
from functools import partial
RegularizedDense=partial(keras.layers.Dense,
activation = 'elu',
kernel_initializer="he_normal",
kernel_regularizer=keras.regularizers.l2(0.01))
model=keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),
RegularizedDense(300),
RegularizedDense(200),
RegularizedDense(10,activation='softmax',kernel_initializer="glorot_uniform")
])
keras.layers.Dropout(rate=0.2),