处理过拟合

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")
])