2.4.2 选择优化器

我们构建1个简单的序贯型全连接神经网络模型,仅包含1个隐藏层,隐藏层的神经元数量为8,激活函数使用ReLU;输出层含一个神经元,激活函数使用Sigmoid。在编译模型时,损失函数选择binary_crossentropy,评价指标为accuracy。在训练模型时,我们将训练集拆分,其中20%作为验证集。最后利用测试集数据对训练好的模型进行性能评估。实现以上步骤的自定义函数代码如下。

> library(keras)
> trainProcess <- function(optimizer){
+   model <- keras_model_sequential()
+   model %>%
+     layer_dense(units = 8,kernel_initializer = 'uniform',
+                 activation = 'relu',input_shape = c(16)) %>%
+     layer_dense(units = 1,kernel_initializer = 'uniform',
+                 activation = 'sigmoid')
+   model %>% compile(loss='binary_crossentropy',
+                     optimizer=optimizer,
+                     metrics=c('accuracy'))
+   history <- model %>% fit(
+     x_train_scale, y_train,
+     batch_size = 10,
+     epochs = 20,
+     verbose = 0,
+     validation_split = 0.2
+   )
+   score <- model %>% evaluate(x_test_scale,y_test)
+   return(score)
+ }

接下来,我们使用SGD、RMSProp、AdaGrad、Adadelta和Adam优化器对模型进行训练,并把测试集的评估结果保存在数据框compare_cx中。

> # SGD优化器、RMSProp优化器、Adagrad优化器、Adadelta优化器、Adam优化器
> optimizer <- c('sgd','rmsprop','adagrad','adadelta','adam')
> compare_cx <- data.frame(row.names = c('optimizer','loss','accuracy'))
> for(i in 1:length(optimizer)){
+     score <- trainProcess(optimizer = optimizer[i])
+     df <- data.frame('optimizer' = optimizer[i],
+                      'loss' = score$loss,
+                      'accuracy' = score$accuracy)
+   compare_cx <- rbind(compare_cx,df)
+ }
> compare_cx
  optimizer        loss   accuracy
1       sgd   0.3115297  0.8656269
2   rmsprop   0.2534245  0.9022195
3   adagrad   0.5433109  0.8656269
4  adadelta   0.6849092  0.8656269
5      adam   0.2550192  0.8890222

对比5个优化器建立的分类模型对测试集的评估结果,表现最好的是RMSProp优化器,其在测试集上预估的损失值最小,准确率最高。接下来,我们选择RMSProp优化器进行下一步工作。