运行一个简单的Keras 网络并且建立一个基准
让我们从截图中看看运行代码后会发生什么:
首先,转储网络架构,我们可以看到使用的不同类型的层,它们的输出形状,它们需要优化多少参数,以及它们如何连接。网络使用48000个样本训练,保留12000样本用于验证(这里的样本指的是训练集中的样本,注意,验证和测试不一样)。建立神经网络模型之后,使用10000个样本进行测试。正如上图所示,Keras内部使用Tensorflow作为后端系统进行计算。目前,我们尚未研究到训练的详细内容,但是不难发现,该程序迭代了200次,并且每次都提高了准确性。
当训练结束时,我们可以发现,在训练阶段,我们得到了92.36%的识别准确率,在验证阶段,我们得到了92.27%的识别准确率,在测试阶段,我们得到了92.22%的识别准确率。
(关于这三个数字的理解,首先,我们将所有的数据分为训练集和测试集两大类;其次,在训练集中,分为训练部分和验证部分两类;最后,92.36%是训练部分,取得的正确率;92.27%是验证部分取得的正确率;92.22%是测试部分取得的识别准确率)。
这意味着在十个手写字符中有不到一个不能被正确识别。优化网络模型,可以做的更好,在下面的截图中,可以看到测试的准确性。
使用Keras中的隐藏层改进简单的网络模型
在训练阶段,验证阶段以及测试阶段,我们有一个基准准确率92.36%,以及验证阶段92.27%,测试阶段92.22%。这是一个很好的起点,但是我们仍然可以改进。
第一个改进的地方是增加网络层数。在输入层之后,有第一个有N_HIDDEN个神经元和激活函数为relu的密集层(全连接层)。这个额外的层(指密集层)被认为是隐藏的,因为它没有直接连接到输入或输出。在第一层隐藏层之后,有第二个隐藏层,同样拥有N_HIDDEN个神经元,再往后是一个拥有10个神经元的输出层,每个神经元在对应数字被识别时触发。(这边,个人认为有点不当之处,在使用softmax函数时,每一次是计算该样本对应所有数字的可能,并从其中选择可能性最大的,输出作为识别结果。)接下来的代码定义了一个新的网络模型:
from __future__ import print_function
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD
from keras.utils import np_utils
np.random.sedd(1671) # 为了再现
# 网络和训练
NB_EPOCH = 20
BATCH_SIZE = 128
VERBOSE = 1
NB_CLASSES = 10 # 输出的数量 = 数字的数量
OPTIMIZER = SGD() # 优化器,本章后面解释
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2 # 训练中用于保留验证的比例
# data:被shuffled(随机打乱),分成训练集和测试集
(X_train,Y_train),(X_test,Y_test) = mnist.load_data()
# X_train 是60000个28*28图像,àreshape 成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’)
#normalize
X_train/=255
X_test /=255
print(X_train.shape[0],’train samples’)
print(X_test.shape[0],’test samples’)
#转换类向量成二进制类矩阵(使用之前提到的一位有效编码)
Y_train = np_utils.to_categorical(Y_train,NB_CLASSES)
Y_test = np_utils.to_categorical(Y_test,NB_CLASSES)
# M_HIDDEN 隐藏层
#10 输出
#最终使用softmax
model = Sequential()
model.add(Dense(N_HIDDEN,input_shape= (RESHAPED,)))
model.add(Activation(‘relu’))
model.add(Dense(N_HIDDEN))
model.add(Activation(‘relu’))
model.add(Dense(NB_CLASSES))
model.add(Activation(‘sotfmax’))
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.evalute(X_test,Y_test,verbose=VERBOSE)
print(“Test score:”,score[0])
print(“Test accuracy:”,score[1])
让我们运行上述代码,并查看该多层网络会得到什么结果。效果还不错。通过增加两个隐藏层,我们在训练集上达到了94.50%的准确率,在验证集达到了94.63%的识别准确率,在测试集上达到了94.41%的识别准确率。与之前的网络相比,我们在测试中得到了额外的2.2%的识别准确率。此外,我们将迭代次数大幅改动,从200次减少到20次。这是一个不错的结果,但是却远不够。
如果你愿意,可以自己尝试只添加一个隐藏层而不是两个,或者添加更多的隐藏层,看看会发生什么。我们把这个作为练习,下面的截图显示了前面示例的输出:
***************************************************************************************************************************************************************
今天的正文部分就先到这里。如果有任何相关问题,请联系1005502596@qq.com,正经问题可能会回复晚一些,但是一定会回复。OK,这边,如果有任何侵权,将会及时删除,给您带来的不便请多谅解。为了进一步了解keras,附上中文版keras文档地址:
https://keras-cn.readthedocs.io/en/latest/layers/recurrent_layer/#recurrent