上QQ阅读APP看书,第一时间看更新
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优化器进行下一步工作。