【问题标题】:R tryCatch neuralnet, unexpected outputR tryCatch 神经网络,意外输出
【发布时间】:2017-04-10 19:48:21
【问题描述】:

我正在为 Kaggle “幽灵、食尸鬼、地精”挑战构建一个神经网络。

我正在对我的(训练)数据进行 X 次采样(出于说明目的 X = 6),将其分成训练集和测试集。然后我在每个 X (6) 个数据集上运行我的神经网络并记录准确度。我这样做是为了比较不同网络之间的准确性(一层 3、4、5 隐藏,两层 3+3、4+3 等)

我的神经网络部分代码是

set.seed(26)
mysamples <- sapply(1:iterations, function(j) {
  temp <- sample(1:371, size = insamplesize, replace = F)
})

nn3results <- data.frame(matrix(0, ncol = iterations, nrow = 1))

myseed <- 0
for (nnloop in 1:iterations){
  myseed = myseed + 1
  set.seed(myseed)
  nn_idx <- mysamples[,nnloop]
  nn_rep_train <- mydata[nn_idx,]
  nn_rep_test <- mydata[-nn_idx,]
  nn_rep <- neuralnet(Ghost+Ghoul+Goblin ~ bone_N + rot_N + hair_N + soul_N, 
                      data=nn_rep_train, hidden=c(4))
  mypredict <- compute(nn_rep, nn_rep_test[,2:5])$net.result
  idx <- apply(mypredict, c(1), maxidx)
  nn_rep_test$Pred <- as.factor(c('Ghost', 'Ghoul', 'Goblin')[idx])
  print(paste("sim",nnloop,"=",round(sum(diag(table(nn_rep_test$type, nn_rep_test$Pred)))
          /outsamplesize,5),"%","myseed = ",myseed))
  nn3results[1,nnloop] <- sum(diag(table(nn_rep_test$type, nn_rep_test$Pred)))
}

这完全符合我的预期,直到迭代 5 神经网络不收敛如下

[1] "sim 1 = 0.74194 % myseed =  1"
[1] "sim 2 = 0.73118 % myseed =  2"
[1] "sim 3 = 0.75269 % myseed =  3"
[1] "sim 4 = 0.74194 % myseed =  4"
Error in nrow[w] * ncol[w] : non-numeric argument to binary operator
In addition: Warning messages:
1: algorithm did not converge in 1 of 1 repetition(s) within the stepmax 
2: In is.na(weights) :
  is.na() applied to non-(list or vector) of type 'NULL'

所以不用担心。我已经修改了我的代码并将其放在tryCatch 中,如下所示。

myseed <- 0
for (nnloop in 1:iterations){
  myseed = myseed + 1
  set.seed(myseed)
  nn_idx <- mysamples[,nnloop]
  nn_rep_train <- mydata[nn_idx,]
  nn_rep_test <- mydata[-nn_idx,]
  tryCatch({
        nn_rep <- neuralnet(Ghost+Ghoul+Goblin ~ bone_N + rot_N + hair_N + soul_N, 
            data=nn_rep_train, hidden=c(4))
        },
       error = function(e){nn3results[1,nnloop] <- -1},
       warning = function(w){nn3results[1,nnloop] <- -1}, 
       finally={
          mypredict <- compute(nn_rep, nn_rep_test[,2:5])$net.result
          idx <- apply(mypredict, c(1), maxidx)
          nn_rep_test$Pred <- as.factor(c('Ghost', 'Ghoul', 'Goblin')[idx])
          print(paste("sim",nnloop,"=",round(sum(diag(
                table(nn_rep_test$type, nn_rep_test$Pred)))
                /outsamplesize,5),"%","myseed = ",myseed))
          nn3results[1,nnloop] <- sum(diag(table(nn_rep_test$type, nn_rep_test$Pred)))
  })
}
nn3results

现在出乎意料的结果。由于模拟 5 返回错误,我希望相应的 nn3results 具有 -1 的值,因为 error = function(e){nn3results[1,nnloop] &lt;- -1} 但现在整个代码似乎工作,即使对于模拟 5,以前它没有。

[1] "sim 1 = 0.74194 % myseed =  1"
[1] "sim 2 = 0.73118 % myseed =  2"
[1] "sim 3 = 0.75269 % myseed =  3"
[1] "sim 4 = 0.74194 % myseed =  4"
[1] "sim 5 = 0.70968 % myseed =  5"
[1] "sim 6 = 0.75269 % myseed =  6"
> nn3results
  X1 X2 X3 X4 X5 X6
1 69 68 70 69 66 70

种子是一样的。结果 1-4 相同。为什么模拟 5 现在可以工作而不返回 -1?

顺便说一句,任何(建设性的)代码建议都会受到赞赏。

【问题讨论】:

    标签: r neural-network try-catch


    【解决方案1】:

    finally 语句中的代码总是在有错误和没有错误时执行。因此,在这种情况下,您正在使用上一步中的模型(模型 4)计算预测。您应该将评估模型的代码放在 tryCatch 块中。

    finally 语句通常用于确保事情得到清理。例如关闭一个文件。无论有没有错误,这都应该发生。

    【讨论】:

    • 谢谢 Jan。当我将代码从 finally 部分移动到主要的 tryCatch expression 部分时,您是对的,模拟 5 不再有结果。不过仍然令人惊讶的是,nn3results[5]0 而不是我所期望的 -1
    • @SC。我无法使用计算机进行测试,但我怀疑您必须使用 &lt;&lt;- 运算符而不是 &lt;- 运算符,因为您要从错误处理函数中分配更高范围的变量。另一种常见的解决方案是将结果初始化为 -1 作为 tryCatch 块中的第一条语句。在没有错误的情况下,稍后会覆盖它。那么你就不需要错误处理程序(除非你想标记警告)
    猜你喜欢
    • 2014-03-16
    • 2015-02-23
    • 2021-10-06
    • 2017-11-21
    • 2012-01-16
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多