1. 学习率调度
恒定高学习率训练可能会发散,低学习率会收敛到最优解但是会花费大量时间
1.1 常用的学习率调度及其概念
幂调度
指数调度
分段调度
性能调度
1.2 实现幂调度
在创建优化器时,设置超参数decay
使用示例:
optimizer=keras.optimizers.SGD(lr=0.001,momentum=0.9,nesterov=True,decay=1e-4)
1.3 实现指数调度
创建一个返回配置函数的函数
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参数传入回调函数
1.4 分段调度
回调函数是一个根据epoch的分段函数
1.5 性能调度
连续一定轮次最好验证损失都没有改善的话它将使学习率乘以某个数
使用示例
lr_scheduler= keras.callbacks.ReduceLROnPlateau(factor=0.5,patience=5)
model.fit(.....,callbacks=[lr_scheduler])
1.5.1 ReduceLROnPlateau
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
)
1.6 在每个步骤更新优化器
定义学习率,然后将学习率传递给任意优化器
使用之前的指数调度,示例如下
s=20 * len(X_train)
learning_rate= tf.optimizers.schedules.ExponentialDecay(0.01,s,0.1)
optimizer=keras.optimizers.SGD(learning_rate)
1.6.1报错 :AttributeError: module ‘keras.api._v2.keras’ has no attribute ‘optimizer’
出错的代码:
learning_rate= tf.keras.optimizer.schedules.ExponentialDecay(0.01,s,0.1)
修改:
learning_rate= tf.optimizers.schedules.ExponentialDecay(0.01,s,0.1)
1.6.2 ExponentialDecay
直接线上翻译(蟒蛇—>python)
2. 正则化
2.1 l1和l2正则化
keras.layers.Dense(300,activation='PReLU',
kernel_initializer='lecun_normal',
kernel_regularizer=keras.regularizers.l2(0.01))
- keras.regularizers.l2 :使用l2正则化
- keras.regularizers.l1:使用l1正则化
- keras.regularizers.l1_l2:使用l1和l2正则化
在训练步骤中的每个步骤都会调用该正则化函数来计算正则化损失
使用重复的代码(往往会有相同的激活函数,初始化策略和正则化函数)可以使用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")
])
2.2 dropout
keras.layers.Dropout(rate=0.2),
- 通常只可以对第一到第三层(不包括输出层)中的神经元应用dropout
- 训练后的我们需要将每个输入连接权重乘以保留概率(1-p)。或者是在训练过程中将每个神经元的输出初一保留概率