暂退法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), ])
|