首页 > 解决方案 > 如何为 keras 编写 R 代码以尝试不同的节点、学习率、辍学等以找到最佳模型

问题描述

我在 r 中使用 keras 和 tensorflow。

我希望我的模型学会使用我在第一层输入的许多测量值在 0 和 1 之间进行分类。

我已经让它与“较小”数量的输入一起工作(大约 500.000 个输入测量值),但不能让它与更多的测量值一起工作(>>1.000.000 个测量值)。

我假设我必须优化我的模型。

我的问题是,我是否可以编写一些代码,以便 keras 一个接一个地使用不同的值来表示学习率、衰减、输入节点数、辍学率,然后向我展示某种读出矩阵(例如 val_acc 的曲线或我的测试样本),所以我可以开始弄清楚哪些参数可能有效?

我尝试使用适用于我的较小模型的参数并从那里向上/向下工作,但无济于事。此外,较小的模型对所有给定参数的变化非常敏感,所以我觉得手动为大型模型找到好的参数需要很长时间。

我的较小的看起来像这样,在我的测试中给了我 75% 的准确度,这已经不算太糟糕了,但我希望更多的测量可以帮助我获得更高的准确度:

model <- keras_model_sequential() 
model %>% 
  layer_dense(units = 42, input_shape = c(measurements)) %>% 
  layer_dropout(0.9) %>%
  layer_dense(units = 2, activation = 'softmax')
sgd <- optimizer_sgd(lr = 0.1, decay=0.001)
model %>% compile(
  loss = 'binary_crossentropy',
  optimizer = sgd,
  metrics = 'accuracy')
history <- model %>% fit(
  data.training, data.trainLabels, 
  epochs = 100, batch_size = 64, 
  view_metrics = FALSE,
  callbacks = callback_tensorboard("logs/run_a"),
  validation_split = 0.2)
score <- model %>% evaluate(data.test, data.testLabels, batch_size = 20)
print(score)

标签: rtensorflowkerasmodel

解决方案


经过反复试验,我找到了答案。

首先,您必须构建将值存储在列中的数据(在我的情况下,这些列是“model_units”、“model_dropout”、“model_lr”和“model_decay”)。

然后得到所有可能的组合:

require(utils)
parameters <- grid.expand(data$model_units, data$model_dropout, data$model_lr, data$model_decay)
parameters <- na.omit(parameters)

然后,您可以在模型的循环中使用它们,在其中逐行迭代。

为此,我使用了 doparallel 和 foreach 并让模型使用一行中的值作为参数。该模型之前被指定为函数。

在循环结束时,我将输出 score$acc(测试集的准确度)保存在新列中的输入文件中。


推荐阅读