对于上集演示的Fashion MNIST 数据集分类训练,接着对其进行优化
1、优化其实无非就是增加其网络容量
增加隐藏层或者增加层里的单元。
2、关于用到Dropout抑制过拟合
(1)说明
之前看过宫廷剧:“后宫佳妃三千,皇上要雨露均沾”,为了防止甄嬛独受宠,要随机掐掉一些激活机会
类似随机森林的思想。深度学习的过拟合已经解决,不是接下来需要研究的内容,这里主要用流行的Dropout。
(2)代码,模型更改
接着上一章,更改模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) # 28*28
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5)) #丢弃50%随机的
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
history = model.fit(train_image, train_lable, epochs=10,
validation_data=(test_image, test_label))
history.history.keys()
#画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.plot(history.epoch, history.history.get('acc'),label='acc')
plt.plot(history.epoch, history.history.get('val_acc'),label='val_acc')
plt.legend()
(3)运行结果:
分析:
测试集的loss和训练集的loss一样在下降,就是很好的。
如果训练集的loss在下降,而测试集的loss反而不下降,就是典型的过拟合问题。
同理:
测试集的准确率acc和训练集的acc一样在上升,就是很好的。
如果训练集的acc在上升,而测试集的acc反而下降,就是典型的过拟合问题。
其实防止过拟合最好的最根本的办法就是
1、增加数据集,数据集足够的时候不会有过拟合问题。这里用Dropout也是数据集有限而已。
2、或者减小网络容量也是一个方法。