开发者学堂课程【Tensorflow 2.0入门与实战:Dropout与过拟合抑制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/664/detail/11111
Dropout 与过拟合抑制
内容介绍:
一、 Dropout 如何抑制过拟合
二、 减小网络容量抑制过拟合
一、Dropout 如何抑制过拟合
如何在网络中添加 Dropout 层,使用已经建立好的 model:
model = tf. keras.Sequential(
)
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))# 28*28
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers. Dense(10,activation='softmax'))
在其中插入 Dropout 层:
model = tf. keras.Sequential(
)
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))# 28*28
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.
Dropout(0.5))
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.
Dropout(0.5))
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.
Dropout(0.5))
model.add(tf.keras.layers. Dense(10,activation='softmax'))
Dropout 中的参数 rate 是0-1之间的一个值,代表抛弃或丢弃掉多大部分的单元数,比如0.5,每次只激活50%,随机的丢弃掉50%,添加多个 Dropout 层效果会更好。
添加 Dropout 层之后,重新训练一下,
从正确率的变化中可以看出,因为 val_acc 的值高于 acc 的值,说明它没有过拟合。
loss 的变化情况所以添加 Dropout 层可以起到一定的抑制过拟合的效果。
二、减小网络容量抑制过拟合
添加 Dropout 层可以起到一定的抑制过拟合的效果,但是抑制过拟合的最好的方法是增加训练数据,第二个比较好的办法是减小网络的容量。
减小网络的容量,使用小型网络会迫使网络学习最关键的数据,从而起到一定的抑制过拟合的效果。
model =tf.keras. Sequential
()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))# 28*28
model.add(tf.keras.layers. Dense(32,activation='relu'))
model.add(tf.keras.layers. Dense(10,activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=' categorical_crossentropy',
metrics=['acc']
)
history = model.fit(train_image,train_label_onehot,
epochs=10,
validation_data=(test_image,test_label_onehot))
看一下结果情况,这就是一个小型网络,从层数来讲,减了一层;从隐藏单元数来讲,只有32个隐藏单元数。
将其训练的过程可视化
plt.plot(history.epoch
,
history.history.get('acc'),label='acc')
plt.plot(history.epoch
,
history.history.get('val_acc')
,
label='val_acc')
plt.legend
(
)
这个小型网络在正确率上呈上升的趋势,说明这个模型训练10个 epoch 是不够的,再多训练几个,可能会达到比较好的结果。
所以减小网络规模,也是抑制过拟合的一种非常好的方法。
抑制过拟合的另一种方法是正则化,原理就是控制网络规模,控制参数的规模。
正则化在实际中应用不多。