2016-04-25 3 views
4

Я экспериментирую с различными алгоритмами в пакете neuralnet, но когда я пытаюсь использовать традиционный алгоритм backprop, результаты очень странные/неутешительные. Почти все расчетные результаты ~ .33 ??? Я предполагаю, что я должен использовать алгоритм неправильно, как если бы я запускал его по умолчанию rprop+, он различает образцы. Конечно, нормальное backpropagation не так уж плохо, особенно если оно способно так быстро сходить к предоставленному порогу.R - neuralnet - Традиционный backprop кажется странным

library(neuralnet) 
data(infert) 

set.seed(123) 
fit <- neuralnet::neuralnet(formula = case~age+parity+induced+spontaneous, 
          data = infert, hidden = 3, 
          learningrate = 0.01, 
          algorithm = "backprop", 
          err.fct = "ce", 
          linear.output = FALSE, 
          lifesign = 'full', 
          lifesign.step = 100) 

preds <- neuralnet::compute(fit, infert[,c("age","parity","induced","spontaneous")])$net.result 

summary(preds) 
     V1   
Min. :0.3347060 
1st Qu.:0.3347158 
Median :0.3347161 
Mean :0.3347158 
3rd Qu.:0.3347162 
Max. :0.3347286 

Возможно, некоторые настройки здесь разные?

Пример по умолчанию neuralnet

set.seed(123) 
fit <- neuralnet::neuralnet(formula = case~age+parity+induced+spontaneous, 
          data = infert, hidden = 3, 
          err.fct = "ce", 
          linear.output = FALSE, 
          lifesign = 'full', 
          lifesign.step = 100) 

preds <- neuralnet::compute(fit, infert[,c("age","parity","induced","spontaneous")])$net.result 

summary(preds) 
     V1   
Min. :0.1360947 
1st Qu.:0.1516387 
Median :0.1984035 
Mean :0.3346734 
3rd Qu.:0.4838288 
Max. :1.0000000 

ответ

3

Рекомендуется, чтобы нормализовать данные перед подачей в нейронной сети. Если вы сделаете это, то вы пойдете правильно:

library(neuralnet) 
data(infert) 

set.seed(123) 
infert[,c('age','parity','induced','spontaneous')] <- scale(infert[,c('age','parity','induced','spontaneous')]) 
fit <- neuralnet::neuralnet(formula = case~age+parity+induced+spontaneous, 
          data = infert, hidden = 3, 
          learningrate = 0.01, 
          algorithm = "backprop", 
          err.fct = "ce", 
          linear.output = FALSE, 
          lifesign = 'full', 
          lifesign.step = 100) 

preds <- neuralnet::compute(fit, infert[,c("age","parity","induced","spontaneous")])$net.result 
summary(preds) 
     V1    
Min. :0.02138785 
1st Qu.:0.21002456 
Median :0.21463423 
Mean :0.33471568 
3rd Qu.:0.47239818 
Max. :0.97874839 

На самом деле есть несколько вопросов, связанных с этим. Why do we have to normalize the input for an artificial neural network?, казалось, имел некоторые из самых деталей.

+0

Интересно, я должен был знать о масштабировании. Спасибо. У вас есть идеи, почему алгоритм 'rprop + 'способен справиться с этим по умолчанию без масштабирования? – cdeterman

+0

Я не ... Я бы предположил, что это где-то в коде, что оно сделано по умолчанию, но я не знаю, почему это было бы иначе. – Tchotchke

+0

Справедливо, спасибо, что ответили на мой вопрос. Я буду копаться и, возможно, снова задаю этот вопрос. – cdeterman

Смежные вопросы