2016-11-26 35 views
1

私は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はエラーを返すので、対応するnn3resultserror = 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を返さないのですか?

何らかの(建設的な)コードアドバイスは、常に高く評価されています。

答えて

1

finallyステートメントのコードは、エラーがあってもエラーがなくても常に実行されます。したがって、この場合、前のステップ(モデル4)のモデルを使用して予測を計算しています。モデルを評価するコードをtryCatchブロック内に配置する必要があります。

finallyステートメントは、物事を整理するためによく使われます。たとえば、ファイルを閉じます。これはエラーの有無にかかわらず発生するはずです。

+0

ありがとうございました。「finally」セクションからメインの「tryCatch式」セクションにコードを移動すると正しいです。シミュレーション5には結果がありません。それでもなお驚くべきことに、 'nn3results [5]'は '0'であり、' -1'ではなく、私が期待しています。 –

+0

@SC。私はテストするコンピュータへのアクセス権がありませんが、エラー処理関数より上位の変数に代入するときに、 '< - '演算子の代わりに '' - '演算子を使う必要があると思われます。別の一般的な解決策は、結果をtryCatchブロックの最初のステートメントとして-1に初期化することです。エラーがなければ、後で上書きされます。エラーハンドラは必要ありません(警告にフラグを付けない限り) –