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)
图1-6 10个训练周期的误差及准确率曲线
从图1-6可知,本例共执行了10个训练周期,且误差越来越小,准确率越来越高。