r - 如何为 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)
解决方案
经过反复试验,我找到了答案。
首先,您必须构建将值存储在列中的数据(在我的情况下,这些列是“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(测试集的准确度)保存在新列中的输入文件中。
推荐阅读
- python - sklearn TfidfTransformer fit() 和 transform() 可以使用同一个源吗
- c - 使用 printf() 函数而不是 cout 的问题
- javascript - 检测某个文本是否是 JavaScript
- typescript - 打字稿枚举的vue v-for
- rust - 错误[E0277]:特征绑定`std::result::Result<_, Box
>: std::error::Error` 不满足 - python - 应该应用哪种技术来拆分大型文本数据集以进行数据匹配?
- android - Android/Jitpack:无法导入子模块
- c++ - std::trivially_copyable_v 和 std::is_pod_v (std::is_standard_layout && std::is_trivial_v) 有什么区别
- apache-flink - Flink:如何实时监控作业
- rust - How to use delayed initialization in rust code and pass compiler "possibly-uninitialized variable" rule?