(二)深度学习基础 -- 5 (2) 丢弃法

5.2 丢弃法

丢弃法存在不同的变体,本文特指倒置丢弃法(inverted dropout)。

5.2.1 定义

(二)深度学习基础 – 3 小节中,介绍了如下图所示的多层感知机:
输入和输出个数分别为4和3,中间的隐藏层包含5个隐藏单元(hidden unit);
多层感知机的层数为2,且隐藏层和输出层都为全连接层。

多层感知机

设隐藏单元为 h i h_i hi i = 1 , … , 5 i=1, \ldots, 5 i=1,,5),激活函数为 ϕ \phi ϕ,输入为 x 1 , … , x 4 x_1, \ldots, x_4 x1,,x4,隐藏单元 i i i的权重参数为 w 1 i , … , w 4 i w_{1i}, \ldots, w_{4i} w1i,,w4i,偏差参数为 b i b_i bi,则有:

h i = ϕ ( x 1 w 1 i + x 2 w 2 i + x 3 w 3 i + x 4 w 4 i + b i ) h_i = \phi\left(x_1 w_{1i} + x_2 w_{2i} + x_3 w_{3i} + x_4 w_{4i} + b_i\right) hi=ϕ(x1w1i+x2w2i+x3w3i+x4w4i+bi)


  • 当对隐藏层使用丢弃法时,隐藏单元将有一定概率被丢弃掉,该丢弃概率即为丢弃法的超参数。
  • 设丢弃概率为 p p p,则 h i h_i hi p p p的概率被清零,有 1 − p 1-p 1p的概率除以 1 − p 1-p 1p做拉伸。

具体来说,设随机变量 ξ i \xi_i ξi为0和为1的概率分别为 p p p 1 − p 1-p 1p。使用丢弃法时,有新的隐藏单元 h i ′ h_i' hi

h i ′ = ξ i 1 − p h i h_i' = \frac{\xi_i}{1-p} h_i hi=1pξihi


若对上图中的隐藏层使用丢弃法,一种可能的结果如下图所示:

隐藏层使用丢弃法的多层感知机

其中, h 2 h_2 h2 h 5 h_5 h5被清零。此时,输出值的计算不再依赖 h 2 h_2 h2 h 5 h_5 h5(反向传播时,与这两个隐藏单元相关权重的梯度均为0)。

由于在训练中,隐藏层神经元的丢弃是随机的,即 h 1 , … , h 5 h_1, \ldots, h_5 h1,,h5都有可能被清零,因此,输出层的计算无法过度依赖 h 1 , … , h 5 h_1, \ldots, h_5 h1,,h5中的任一个,在训练模型时起到正则化的作用,可以用来应对过拟合。


5.2.2 代码实现

(1) 生成数据集
import tensorflow as tf
from tensorflow.keras import datasets, Sequential, layers, optimizers, losses
(x_train,y_train), (x_test,y_test) = datasets.fashion_mnist.load_data()

# 矩阵相乘需要float型,故强制进行类型转换;归一化
x_train = tf.cast(x_train, tf.float32) / 255
x_test = tf.cast(x_test, tf.float32) / 255

batch_size = 256
train_iter = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(batch_size=batch_size)
test_iter = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(batch_size=batch_size)
(2) 定义、训练模型

注:丢弃法只在训练模型时使用。

model = Sequential([
    
    layers.Flatten(input_shape=(28,28)),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.2),
    layers.Dense(10, activation=tf.nn.softmax)
])

model.compile(
    optimizer=optimizers.Adam(),
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)
model.fit(x_train,y_train,batch_size=batch_size,epochs=5,validation_data=(x_test,y_test),validation_freq=1)

输出:

Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.6794 - accuracy: 0.7573 - val_loss: 0.4473 - val_accuracy: 0.8346
Epoch 2/5
60000/60000 [==============================] - 1s 23us/sample - loss: 0.4665 - accuracy: 0.8325 - val_loss: 0.4075 - val_accuracy: 0.8551
Epoch 3/5
60000/60000 [==============================] - 1s 24us/sample - loss: 0.4273 - accuracy: 0.8444 - val_loss: 0.3886 - val_accuracy: 0.8627
Epoch 4/5
60000/60000 [==============================] - 1s 22us/sample - loss: 0.4034 - accuracy: 0.8537 - val_loss: 0.3822 - val_accuracy: 0.8669
Epoch 5/5
60000/60000 [==============================] - 1s 21us/sample - loss: 0.3831 - accuracy: 0.8598 - val_loss: 0.3650 - val_accuracy: 0.8676


参考

《动手学深度学习》(TF2.0版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值