《Keras》翻译连载3

运行一个简单的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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值