概述
本文通过代码感受 Dropout抑制过拟合
tf.keras.layers.Dropout api参见:
https://www.malaoshi.top/show_1EF48s9XYqUL.html
关键代码
添加Dropout层
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128,activation='relu'))
#增加Dropout层
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128,activation='relu'))
#增加Dropout层
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128,activation='relu'))
#增加Dropout层
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(10,activation='softmax'))
代码
# 加载数据
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
(train_image,train_label),(test_image,test_label)=tf.keras.datasets.fashion_mnist.load_data()
归一化
train_image=train_image/255
test_image=test_image/255
独热编码
train_label_onehot=tf.keras.utils.to_categorical(train_label)
test_label_onehot=tf.keras.utils.to_categorical(test_label)
建立模型
model=tf.keras.Sequential()
# 线性回归中是一维数据,而图像数据是二维数据,需要将二维数据转换成一维数据
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128,activation='relu'))
#增加Dropout层
# model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128,activation='relu'))
#增加Dropout层
# model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128,activation='relu'))
#增加Dropout层
# model.add(tf.keras.layers.Dropout(0.5))
# 10个分类,softmax的作用就是将10个输出值变成概率值,这些概率值之和为1
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.summary()
配置
optimizer=tf.keras.optimizers.Adam()
model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['acc'])
开始训练
history=model.fit(train_image,train_label_onehot,epochs=5,validation_data=(test_image,test_label_onehot))
显示损失值图像
history.history.get('loss')
plt.plot(history.epoch,history.history.get('loss'),label='loss')
plt.plot(history.epoch,history.history.get('val_loss'),label='val_loss')
plt.legend()
plt.show()
损失值一直在下降
显示正确率图像
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()
plt.show()
执行结果如下:
正确率一直上升

