dropout 是神经网络最有效也最常用的正则化方法之一。在训练过程中随机将该层的一些输出特征舍弃(设置为0)。 dropout 比率(dropout rate)是被设为 0 的特征所占的比例,通常在 0.2~0.5范围内。测试时没有单元被舍弃,而该层的输出值需要按 dropout 比率缩小。
例: 假设矩阵layer_output, 其 形 状 为 (batch_size, features)。训练时,我们随机将矩阵中一部分值设为 0。
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)
# 训练时,舍弃50%的输出单元
测试时,我们将输出按 dropout 比率缩小。这里我们乘以 0.5(因为前面舍弃了一半的单元)。
layer_output *= 0.5
# 测试时
这样做麻烦,可以将两个运算都在训练时进行,测试时输出保持不变。
layer_output *= np.random.randint(0, high=2, size=layer_output.shape) # 训练时
layer_output /= 0.5 # 注意,是成比例放大而不是成比例缩小
# 向 IMDB 网络中添加 dropout
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
防止神经网络过拟合的常用方法
- 获取更多的训练数据
- 减小网络容量
- 添加权重正则化
- 添加 dropout
网友评论