Keras深度学习试验(一):全连接网络

本文通过试验对比分析全连接网络各参数和算法的效果。工具:Keras,数据集:mnist。 参考《Keras深度学习实战》一书。
(1)baseline

import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD ,RMSprop, Adam
from keras.utils import np_utils
np.random.seed(0)

#网络和训练
NB_EPOCH = 200
BATCH_SIZE = 128
VERBOSE = 1
NB_CLASSES = 10
OPTIMIZER = SGD()
VALIDATION_SPLIT = 0.2

(X_train, y_train), (X_test, y_test) = mnist.load_data()
#X_train是60000行28*28数据,变形为60000*784
RESHAPED = 784

X_train = X_train.reshape(60000,RESHAPED)
X_test = X_test.reshape(10000,RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train = X_train/255
X_test = X_test/255

Y_train = np_utils.to_categorical(y_train,NB_CLASSES)
Y_test = np_utils.to_categorical(y_test,NB_CLASSES)

model = Sequential()
model.add(Dense(NB_CLASSES, input_shape=(RESHAPED,)))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',optimizer=OPTIMIZER,metrics=['accuracy'])
history = model.fit(X_train,Y_train,batch_size=BATCH_SIZE,epochs=NB_EPOCH,verbose=VERBOSE,
                    validation_split=VALIDATION_SPLIT)
score=model.evaluate(X_test,Y_test,verbose=VERBOSE)
print('Test score:',score[0])
print('Test accuracy:',score[1])

运行结果:

48000/48000 [==============================] - 0s 9us/step - loss: 0.2760 - acc: 0.9231 - val_loss: 0.2756 - val_acc: 0.9228
10000/10000 [==============================] - 0s 11us/step
Test score: 0.27735333164036274
Test accuracy: 0.9216

训练集和验证集上的精度随训练步数的增长如图:
Keras深度学习试验(一):全连接网络_第1张图片
(2)对比各种激活函数的效果:(epoch=200)

Activation softmax softplus sigmoid relu tanh linear 不要
Test accuracy 0.9216 0.9220 0.9219 0.098 0.098 0.1123 0.1123

本例中只使用了一层,relu、tanh、linear都没有效果,相当于10个数瞎猜的10%的准确率,而linear和不使用激活函数是一样的。更多的试验可以发现,在输出层中只能使用softmax、softplus、sigmoid这些。
(3)添加隐藏层使深度增加(epoch=200)
添加的隐藏层应使用relu激活函数(隐藏层使用softmax会使收敛极慢,效果很差),而输出层使用softmax。

隐藏层 单层128节点 单层128节点(softmax) 单层256节点 单层64节点 单层32节点 单层16节点
Test acc 0.9732 0.5107 0. 9760 0.9718 0.9649 0.9467
隐藏层 双层128+128 128+64 128×3 128×4 128+dropout (0.3)+128 128+dropout (0.2)+128
Test acc 0.9761 0.9765 0.9764 0.9735 0.9776 0.9784

使用单层128节点+relu作为隐藏层(中间层)时的精度随训练步数增长如下图,可见,层数加深以后训练速度和精度都明显提升。
Keras深度学习试验(一):全连接网络_第2张图片
使用单层128节点+softmax作为隐藏层(中间层),如下图。这时输出层也使用softmax,导致模型收敛非常缓慢。所以隐藏层通常应使用relu。
Keras深度学习试验(一):全连接网络_第3张图片
使用更深的层数能使训练步数减少(即用较少步数就可以达到一个不错的成绩),但并不能使最终的测试集预测精度提高。下图是使用128×4层网络的训练过程图:
Keras深度学习试验(一):全连接网络_第4张图片
使用dropout可以使精度进一步提高,见上表格。
(4)优化器、batch_size、learning_rate的效果
下面都使用128+dropout+128作为隐藏层的网络结构。
不同优化器的效果:

优化器 SGD RMSprop Adam Adagrad Adadelta Adamax Nadam
Test acc (20 epochs) 0.9464 0.9770 0.9804 0.9779 0.9798 0.9798 0.9807
Test acc (100 eps) 0.9732 0.9818 0.9807 0.9800 0.9806 0.9816 0.9825

各种优化器的验证集精度随训练步数增长情况见下图:
Keras深度学习试验(一):全连接网络_第5张图片
不同batch_size的效果(均使用Adam优化器):
结论:使用的batch_size越大,每步计算越快,但收敛的步数变多。

batch_size 32 64 128 256 512
Test acc 0.9804 0.9785 0.9806 0.9793 0.9791
速度:us/Step 75 43 25 17 15

不同learning_rate的效果(均使用Adam优化器,batch_size=128):

learning rate 0.0001 0.001 0.005 0.01 0.02 0.05 0.1
Test acc 0.9677 0.9781 0.9776 0.9760 0.9588 0.7952 0.1135

好了,本节就到这里。下一节开展卷积网络的试验。

你可能感兴趣的:(深度学习)