我在R中使用了Keras的一个简单的应用程序,这取决于set.seed(value)值,有时它会收敛,有时不会,我想是因为种子设置了最初的随机权重。如果它一开始不收敛,我通常可以通过更改种子值使它在不同的运行中收敛,但我必须手动监视/停止它。如果模型没有在指定的时间后收敛(例如,在600秒后停止并使用不同的种子值重新启动它),我如何停止Keras。
set.seed(42)
x <- as.matrix(train_data)
y <- as.matrix(train_targets)
model = keras_model_sequential() %>%
layer_dense(units=64, kernel_regularizer=regularizer_l2(0.001), activation="relu", input_shape=dim(train_data)[[2]]) %>%
layer_dense(units=32, kernel_regularizer=regularizer_l2(0.001), activation = "relu") %>%
layer_dense(units=1, activation="linear")
model %>% compile(
loss = "mse",
optimizer = "rmsprop",
metrics = list("mae")
)
model %>% fit(x, y, epochs = 50,verbose = 0)发布于 2022-05-08 05:35:12
一种选择是定义一个调用自己的函数,可能在此之前执行一个类似于设置种子的操作。基于这是如此的帖子,并从角面导轨中借用一个需要几秒钟才能运行的示例。
library(keras)
d <- dataset_mnist()
x_train <- d$train$x
y_train <- d$train$y
x_test <- d$test$x
y_test <- d$test$y
x_train <- array_reshape(x_train, c(nrow(x_train), 784))
x_test <- array_reshape(x_test, c(nrow(x_test), 784))
x_train <- x_train / 255
x_test <- x_test / 255
y_train <- to_categorical(y_train, 10)
y_test <- to_categorical(y_test, 10)
model <- keras_model_sequential()
model %>%
layer_dense(units = 256, activation = 'relu', input_shape = c(784)) %>%
layer_dropout(rate = 0.4) %>%
layer_dense(units = 128, activation = 'relu') %>%
layer_dropout(rate = 0.3) %>%
layer_dense(units = 10, activation = 'softmax')
model %>% compile(
loss = 'categorical_crossentropy',
optimizer = optimizer_rmsprop(),
metrics = c('accuracy')
)我们可以创建一个递归函数,在超时后调用它自己。
timed_fit <- function(t = 5) {
Sys.sleep(1)
set.seed(t)
message("seed set to ", t)
setTimeLimit(cpu = t, elapsed = t, transient = TRUE)
on.exit({setTimeLimit(cpu = Inf, elapsed = Inf, transient = FALSE)})
tryCatch({
model %>% fit(
x_train, y_train,
epochs = 4, batch_size = 128,
validation_split = 0.2
)
}, error = function(e) {
if (grepl("reached elapsed time limit|reached CPU time limit", e$message)) {
message("\n timed out!\n") # or set another seed, continue
timed_fit(t + 10)
} else {
# error not related to timeout
stop(e)
}
})
}
timed_fit()插入Sys.sleep(1)是为了避免错误没有正确地中断进程,尽管出现了。

https://stackoverflow.com/questions/72156929
复制相似问题