动手深度学习note-2(暂退法)

暂退法drop_out

介绍:

dropout2

一种效果上正则化的方法,模型随机丢弃一部分神经元的输出,从而迫使模型学习更加鲁棒的特征\(_{(对噪声、异常值和数据分布的变化不敏感的特征)}\)

理解:学习一些更加抽象的信息,例如人类能分辨模糊的图片是哪种物品

公式:

\[ \begin{aligned} h' = \begin{cases} 0 & \text{ 概率为 } p \\ \frac{h}{1-p} & \text{ 其他情况} \end{cases} \end{aligned} \]

经过该公式,一部分神经元被重置为0,另一部分的神经元被扩大,即特征更加突出。

计算模型的期望,保持不变,模型保持稳定 \[ E(h)=h=0\times p+\frac{h}{1-p}\times (1-p) \]

代码实现:

1
2
3
4
5
6
7
8
9
10
11
def dropout_layers(X, dropout):
assert 0 <= dropout <= 1
if dropout == 1:
return tf.zeros_like(X)
if dropout == 0:
return X
mask = tf.random.uniform(
shape = tf.shape(X), minval=0, maxval=1
)
mask = mask < 1-dropout
return tf.cast(mask, dtype=tf.float32) * X / (1.0 - dropout)

测试dropout

1
2
3
4
5
X = tf.reshape(tf.range(16, dtype=tf.float32),(2,8))
print(X)
print(dropout_layers(X,0.))
print(dropout_layers(X,0.5))
print(dropout_layers(X,1.))
1
2
3
4
5
6
7
8
9
10
11
12
13
# 打印结果
tf.Tensor(
[[ 0. 1. 2. 3. 4. 5. 6. 7.]
[ 8. 9. 10. 11. 12. 13. 14. 15.]], shape=(2, 8), dtype=float32)
tf.Tensor(
[[ 0. 1. 2. 3. 4. 5. 6. 7.]
[ 8. 9. 10. 11. 12. 13. 14. 15.]], shape=(2, 8), dtype=float32)
tf.Tensor(
[[ 0. 0. 0. 0. 8. 0. 0. 0.]
[ 0. 18. 0. 0. 24. 0. 0. 0.]], shape=(2, 8), dtype=float32)
tf.Tensor(
[[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]], shape=(2, 8), dtype=float32)

应用到训练

1
2
3
4
5
6
7
8
9
dropout1, dropout2 = 0.2, 0.3
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dropout(dropout1),
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dropout(dropout2),
tf.keras.layers.Dense(10),
])

动手深度学习note-2(暂退法)
https://blog.potential.icu/2024/01/26/动手深度学习note-2(暂退法)/
Author
Xt-Zhu
Posted on
January 26, 2024
Licensed under