Keras深度学习:入门、实战与进阶
上QQ阅读APP看书,第一时间看更新

1.4.3 模型建立及训练

我们将建立序贯(Sequential)堆积的深度神经网络模型,后续只需要通过%>%将各个神经网络层加入模型即可。该模型网络结构如下。

  • 输入层:因为每个数字图像的形状为784,故输入层共有784个神经元。
  • 隐藏层:共有256个神经元,激活函数为ReLU。
  • 输出层:共有10个神经元,因为是多分类问题,激活函数为Softmax。

通过以下程序代码建立一个序贯模型,并通过 %>% 将输入层、隐藏层和输出层加入模型中。

> # 建立模型结构
> model <- keras_model_sequential()             # 建立序贯模型
> model %>% layer_dense(units = 256,
+                       input_shape = c(784),
+                       kernel_initializer = 'normal',
+                       activation = 'relu')    # 添加隐藏层
> model %>% layer_dense(units = 10,
+                       kernel_initializer = 'normal',
+                       activation = 'softmax') # 添加输出层

layer_dense()函数用于建立全连接神经网络层,即所有的上一层与下一层的神经元都完全连接。其中参数units用来定义神经元个数,参数input_shape用来指定输入层的形状,参数kernel_initializer用来定义网络层初始化权重的设置方法,参数activation用来定义激活函数。

在训练模型之前,我们必须使用compile()函数对训练模型进行编译,代码如下:

> model %>% compile(loss = 'categorical_crossentropy',
+                   optimizer = 'adam',
+                   metrics = c('accuracy'))

compile()函数中的参数loss用于设置损失函数,因为属于多分类,故设为categorical_crossentropy;参数optimizer用于设置深度学习在训练时所使用的优化器,此例为adam;参数metrics用于设置模型的评估方法,此例为准确率。

最后,通过fit()函数对模型进行训练。参数validation_split设置为0.2,则Keras训练前会自动将训练数据分成两部分:80%作为训练数据,20%作为验证数据;参数epochs为10,说明执行10个训练周期;参数batch_size为200,说明每一批次有200个数据;参数verbose为2,表示显示训练过程。

> train_history <- model %>% fit(x=x_Train_normalize,
+                                y=y_TrainOneHot,validation_split=0.2,
+                                epochs=10, batch_size=200,verbose=2)
Train on 48000 samples, validate on 12000 samples
Epoch 1/10
 - 6s - loss: 0.4386 - acc: 0.8822 - val_loss: 0.2159 - val_acc: 0.9407
Epoch 2/10
 - 3s - loss: 0.1851 - acc: 0.9473 - val_loss: 0.1539 - val_acc: 0.9556
Epoch 3/10
 - 2s - loss: 0.1289 - acc: 0.9635 - val_loss: 0.1216 - val_acc: 0.9645
Epoch 4/10
 - 3s - loss: 0.0975 - acc: 0.9724 - val_loss: 0.1084 - val_acc: 0.9677
Epoch 5/10
 - 2s - loss: 0.0774 - acc: 0.9782 - val_loss: 0.0944 - val_acc: 0.9713
Epoch 6/10
 - 2s - loss: 0.0638 - acc: 0.9825 - val_loss: 0.0869 - val_acc: 0.9743
Epoch 7/10
 - 2s - loss: 0.0512 - acc: 0.9862 - val_loss: 0.0896 - val_acc: 0.9721
Epoch 8/10
 - 2s - loss: 0.0434 - acc: 0.9883 - val_loss: 0.0857 - val_acc: 0.9747
Epoch 9/10
 - 3s - loss: 0.0362 - acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9748
Epoch 10/10
 - 4s - loss: 0.0298 - acc: 0.9926 - val_loss: 0.0764 - val_acc: 0.9767

训练过程的第一行说明80%作为训练数据(48 000=60 000×0.8),20%作为验证集。训练完成后,计算每个训练周期的误差与准确率。

利用plot()函数绘制出10次训练周期的误差及准确率曲线,如图1-6所示。

> plot(train_history)
028-1

图1-6 10个训练周期的误差及准确率曲线

从图1-6可知,本例共执行了10个训练周期,且误差越来越小,准确率越来越高。