之前使用Keras构建了简单的前馈神经网络,并通过SGD方式进行训练,很好地已完成红酒分类任务。现在我们通过复杂一些的任务来看看BP神经网络的性能。我们选择mnist手写数字库来进行测试,Keras包含了这个数据库,可以通过下面的方式来调用此数据库:
#通过Keras导入mnist数据库
from keras.datasets import mnist
# keras中的mnist数据集已经被划分成了60,000个训练集,10,000个测试集的形式
(X_train, y_train), (X_test, y_test) = mnist.load_data()
读取数据并且构建Keras所需的训练集和测试集(张量)之后,开始构建神
经网络:
-
多层感知机(增加dropout层)
model.add(Dense(256, activation='relu', input_dim=784)) model.add(Dropout(0.2)) model.add(Dense(256, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(10, activation='softmax'))
-
多层感知机
model.add(Dense(256, activation='relu', input_dim=784)) model.add(Dense(256, activation='relu')) model.add(Dense(10, activation='softmax'))
-
简单前馈神经网络
model.add(Dense(256, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax'))
之后通过编译训练,就可以分别得到不同神经网络的分类结果。
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
hist=model.fit(train_x_scaled, y_train,
epochs=20,
batch_size=10,validation_data=(test_x_scaled, y_test))
结果分析:比较图2、图3可以看到多层感知机要比简单前馈神经网络出现过拟合现象(虽然都不算很明显),而图1和图2相比较,可以看出增加dropout层之后的多层感知机出现过拟合现象更晚,说明dropout对过拟合是有一定抑制作用的。
多层感知机+dropout层 多层感知机 简单前馈神经网络最后比较一下,三种神经网络的性能,比较明显多层感知器+dropout层要优化其它两种神经网络。(虽然相差不多)
性能比较完整的程序和数据:下载
欢迎访问我的博客monte3card's blog
网友评论