2017-03-09 5 views
1

J'ai été capable d'utiliser nnet et neuralnet pour prédire des valeurs dans un réseau backprop conventionnel, mais je me suis efforcé de faire de même avec MXNET et R pour de nombreuses raisons.ne peut pas prédire dans mxnet 0.94 pour R

Ceci est le fichier (CSV simple avec les en-têtes, les colonnes ont été normalisées) https://files.fm/u/cfhf3zka

Et c'est le code que j'utilise:

filedata <- read.csv("example.csv") 

require(mxnet) 

datain <- filedata[,1:3] 
dataout <- filedata[,4] 

lcinm <- data.matrix(datain, rownames.force = "NA") 
lcoutm <- data.matrix(dataout, rownames.force = "NA") 
lcouta <- as.numeric(lcoutm) 

data <- mx.symbol.Variable("data") 
fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=3) 
act1 <- mx.symbol.Activation(fc1, name="sigm1", act_type="sigmoid") 
fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=3) 
act2 <- mx.symbol.Activation(fc2, name="sigm2", act_type="sigmoid") 
fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=3) 
act3 <- mx.symbol.Activation(fc3, name="sigm3", act_type="sigmoid") 
fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=1) 
softmax <- mx.symbol.LogisticRegressionOutput(fc4, name="softmax") 

mx.set.seed(0) 
mxn <- mx.model.FeedForward.create(array.layout = "rowmajor", softmax, X = lcinm, y = lcouta, learning.rate=0.01, eval.metric=mx.metric.rmse) 

preds <- predict(mxn, lcinm) 

predsa <-array(preds) 

predsa 

La sortie de la console est:

Start training with 1 devices 
[1] Train-rmse=0.0852988247858687 
[2] Train-rmse=0.068769514264606 
[3] Train-rmse=0.0687647380075881 
[4] Train-rmse=0.0687647164103567 
[5] Train-rmse=0.0687647161066822 
[6] Train-rmse=0.0687647160828069 
[7] Train-rmse=0.0687647161241598 
[8] Train-rmse=0.0687647160882147 
[9] Train-rmse=0.0687647160594508 
[10] Train-rmse=0.068764716079949 
> preds <- predict(mxn, lcinm) 
Warning message: 
In mx.model.select.layout.predict(X, model) : 
    Auto detect layout of input matrix, use rowmajor.. 

> predsa <-array(preds) 
> predsa 
    [1] 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 
    [10] 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 0.6776764 

Donc, il obtient une «moyenne», mais il n'est pas capable de prédire des valeurs, d'avoir essayé d'autres moyens et d'apprendre à éviter la surprédiction, mais il n'a jamais d une sortie même variable.

Répondre

0

J'ai essayé de vous donner un exemple et il semble que vous essayez de prédire la sortie continue avec un LogisticRegressionOutput. Je crois que vous devriez utiliser le LinearRegressionOutput. Vous pouvez voir des exemples de ceci here et un exemple Julia here. En outre, puisque vous prédisez une sortie continue, il peut être préférable d'utiliser une autre fonction d'activation telle que ReLu, voir les raisons pour cela à this question.

Avec ces changements, j'ai produit le code suivant:

data <- mx.symbol.Variable("data") 
fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=3) 
act1 <- mx.symbol.Activation(fc1, name="sigm1", act_type="softrelu") 
fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=3) 
act2 <- mx.symbol.Activation(fc2, name="sigm2", act_type="softrelu") 
fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=3) 
act3 <- mx.symbol.Activation(fc3, name="sigm3", act_type="softrelu") 
fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=1) 
softmax <- mx.symbol.LinearRegressionOutput(fc4, name="softmax") 

mx.set.seed(0) 
mxn <- mx.model.FeedForward.create(array.layout = "rowmajor", 
            softmax, 
            X = lcinm, 
            y = lcouta, 
            learning.rate=1, 
            eval.metric=mx.metric.rmse, 
            num.round = 100) 

preds <- predict(mxn, lcinm) 

predsa <-array(preds) 
require(ggplot2) 
qplot(x = dataout, y = predsa, geom = "point", alpha = 0.6) + 
    geom_abline(slope = 1) 

Cela me obtient un taux d'erreur en constante diminution:

Start training with 1 devices 
[1] Train-rmse=0.0725415842873665 
[2] Train-rmse=0.0692660343340093 
[3] Train-rmse=0.0692562284995407 
... 
[97] Train-rmse=0.048629236911287 
[98] Train-rmse=0.0486272021266279 
[99] Train-rmse=0.0486251858007309 
[100] Train-rmse=0.0486231872849457 

et les sorties prévues commencent à aligner sur les sorties réelles comme l'a démontré avec cette intrigue: enter image description here

+0

J'ai marqué votre solution comme correcte puisque vous avez montré le crossplot et cela me suffit, mais votre solution soulève m Des questions telles que, pourquoi un LinearRegression et pas un courbé comme un Sigmoïde (ou pourquoi la Logistique ne fonctionne pas du tout). Et pourquoi diable ce réseau est mille fois plus lent que nnet et neuralnet (même avec un sigmoïde comme activation) fonctionnant tous dans le même CPU – David