Проблема создания нейронной сети в R - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в нейронных сетях и пытаюсь воспроизвести результаты симуляционного исследования, в котором авторы создали нейронную сеть с одним скрытым слоем, состоящим из пяти нейронов. Они использовали функцию активации ReLU во входном слое, поэтому я следовал this и использовал аргумент

relu <-function(x) {log(1+exp(x))}

для реализации этого. Они также использовали кросс-энтропийную потерю для вывода, поэтому я использовал аргумент

err.fct="ce"

. Я предоставил полностью воспроизводимый код ниже. Этот код дает следующую ошибку

Error in 
    "if (reached.threshold < min.reached.threshold) {" : 
     missing value where TRUE/FALSE needed

и, следуя этому совету, я включил аргумент

 learningrate = 0.0001

, но я все еще получаю ту же ошибку. Я также пытался установить stepmax = 1e7 и масштабировать данные, но мне не повезло. Любая помощь будет принята с благодарностью.

В качестве примечания, авторы достигли уровня ошибочной классификации около 0,1 при использовании NN и нескольких других алгоритмов классификации (RF, SVM, LR и др. c.) I смог воспроизвести эти показатели ошибочной классификации, используя эти другие методы.

library(neuralnet)
library(MASS)

  n_0=300
  n_1=300

  cov<-diag(1,5,5)
  for(i in 1:5){
    for(j in 1:5){
      cov[i,j]=0.5^(abs(i-j))
    }
  }


  ### training data ###
  set.seed(123)
  x<-mvrnorm(n = n_0, rep(0,5), Sigma=cov)
  set.seed(123)
  y<-mvrnorm(n = n_1, c(1,1.5,2,1.5,1), Sigma=cov)
  train<-rbind(x,y)
  z<-c(rep(0,n_0),rep(1,n_1))

  training.dat<-cbind(train,z)
  training.dat<-as.data.frame(training.dat)
  training.dat[,1:5]<-scale(training.dat[,1:5])

  ### testing data ###
  set.seed(123)
  x<-mvrnorm(n = n_0, rep(0,5), Sigma=cov)
  set.seed(123)
  y<-mvrnorm(n = n_1, c(1,1.5,2,1.5,1), Sigma=cov)
  test<-rbind(x,y)
  z<-c(rep(0,n_0),rep(1,n_1))

  testing.dat<-cbind(test,z)
  testing.dat<-as.data.frame(testing.dat)


  relu <-function(x) {log(1+exp(x))}

  nn=neuralnet(as.factor(z) ~ ., data=training.dat, hidden=5, act.fct = relu, err.fct="ce",
               linear.output = FALSE, learningrate = 0.0001, stepmax = 1e7)
...