首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在指定时间后未能收敛时停止Keras

在指定时间后未能收敛时停止Keras
EN

Stack Overflow用户
提问于 2022-05-07 22:58:09
回答 1查看 36关注 0票数 2

我在R中使用了Keras的一个简单的应用程序,这取决于set.seed(value)值,有时它会收敛,有时不会,我想是因为种子设置了最初的随机权重。如果它一开始不收敛,我通常可以通过更改种子值使它在不同的运行中收敛,但我必须手动监视/停止它。如果模型没有在指定的时间后收敛(例如,在600秒后停止并使用不同的种子值重新启动它),我如何停止Keras。

代码语言:javascript
复制
  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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-08 05:35:12

一种选择是定义一个调用自己的函数,可能在此之前执行一个类似于设置种子的操作。基于这是如此的帖子,并从角面导轨中借用一个需要几秒钟才能运行的示例。

代码语言:javascript
复制
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')
)

我们可以创建一个递归函数,在超时后调用它自己。

代码语言:javascript
复制
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)是为了避免错误没有正确地中断进程,尽管出现了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72156929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档