私はKaggle、 "Ghost、Ghoul、Goblin"チャレンジのためのニューラルネットを構築しています。R tryCatch neuralnet、予期せぬ出力
トレーニングデータとテストセットデータをX回(例:X = 6)サンプリングしています。次に、各X(6)データセットで自分のニューラルネットを実行し、精度を記録します。私はこれをやっているので、異なるネット間の精度を比較することができます(1つのレイヤ3,4,5隠しレイヤ2 3 + 3 4 + 3など)
コードの神経回路網部分は
です私は[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'
だから、心配しないように、次のようにニューラルネットが収束しない反復5まで、期待どおりに実行
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)))
}
。私は自分のコードを変更して、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
はerror = function(e){nn3results[1,nnloop] <- -1}
のために-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を返さないのですか?
何らかの(建設的な)コードアドバイスは、常に高く評価されています。
ありがとうございました。「finally」セクションからメインの「tryCatch式」セクションにコードを移動すると正しいです。シミュレーション5には結果がありません。それでもなお驚くべきことに、 'nn3results [5]'は '0'であり、' -1'ではなく、私が期待しています。 –
@SC。私はテストするコンピュータへのアクセス権がありませんが、エラー処理関数より上位の変数に代入するときに、 '< - '演算子の代わりに '' - '演算子を使う必要があると思われます。別の一般的な解決策は、結果をtryCatchブロックの最初のステートメントとして-1に初期化することです。エラーがなければ、後で上書きされます。エラーハンドラは必要ありません(警告にフラグを付けない限り) –