处理过拟合¶
Note
我们有多种处理过拟合的方法,如正则化、Dropout、BatchNormalization。
一般来说BatchNormalization和另外两个是互斥的,不要一起使用。
正则化¶
from tensorflow import keras
# 在全连接层中定义l2正则
layer = keras.layers.Dense(100,
kernel_regularizer=keras.regularizers.l2(0.01))
\(l_{p}\) 正则化是软性的限制,我们也可以硬性规定一个权重的max-norm,如果超过则截断。
# 如果权重的l2-norm超过阈值则截断
layer = keras.layers.Dense(100,
kernel_constraint=keras.constraints.max_norm(1.))
Dropout¶
# Dropout定义在激活函数之后
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dropout(rate=0.2),
keras.layers.Dense(300, activation="elu", kernel_initializer="he_normal"),
keras.layers.Dropout(rate=0.3),
keras.layers.Dense(10, activation="softmax")
])
BatchNormalization¶
即批标准化
# BatchNormalization一般定义在激活函数之前,定义在激活函数之后也不是不可以
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.BatchNormalization(),
keras.layers.Dense(300, activation="elu", kernel_initializer="he_normal"),
# 这里我们定义在激活函数之后
keras.layers.BatchNormalization(),
keras.layers.Dense(100, activation="elu", kernel_initializer="he_normal"),
keras.layers.BatchNormalization(),
keras.layers.Dense(10, activation="softmax")
])