2017-03-09 2 views
1

従来のバックプロップネットワークではnnetとneuralnetを使用して値を予測できましたが、MXNETとRで多くの理由で同じことをしていました。はmxnet 0.94でRについては予測できません

これはファイル(、列が正規化されたヘッダを持つシンプルなCSVていた)され https://files.fm/u/cfhf3zka

そして、これは私が使用するコードです:

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 

コンソール出力は次のとおりです。

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 

それは「平均」を得るが、値を予測することができず、過予測を避けるために他の方法や学習を試みたが、 dは偶数変数出力です。

答えて

0

私はあなたの例です。LogisticRegressionOutputで継続的な出力を予測しようとしているようです。 LinearRegressionOutputを使用する必要があります。このhereの例とジュリアの例hereがあります。また、継続的な出力を予測しているので、ReLuのような別のアクティベーション機能を使用する方が良いかもしれません。その理由のいくつかはthis questionにあります。実証されたように

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 

予測出力は、実際の出力に合わせて開始します。

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) 

これは私が常に減少エラーレート取得します。これらの変更により

は、私は次のコードを生成しました

+0

クロスプロットが表示されていて、これで十分ですが、あなたの解決策は次のようになります。なぜLinearRegressionであり、Sigmoidとして湾曲したものではないのか(なぜロジスティックは全く働いていないのか)、そして、なぜこのネットワークは、nnetとneuralnet(同じCPU内で実行されているシグモイドでも)よりも1000倍遅い – David

関連する問題