2017-01-17 90 views
1

我有一個包含4列的CSV文件。 3個輸入和1個輸出。已經正常化。我可以使用nnet和neuralnet來訓練一個網絡,它有3個輸入,3個隱藏層,每個節點有3個節點和一個輸出。有用。R mxnet使用3x3隱藏層創建3輸入1輸出迴歸

我想對MXNET做同樣的事情,但在完成迴歸時,「FullyConected」的參數必須隱藏= 1。任何其他值只會引發錯誤消息。

如何在標題或圖片中構建網絡?

NeuralNet Plot

這是代碼:

csvIn <- read.csv("normalized.csv") 

require(mxnet) 

inputData <- csvIn[,1:3] 
outputData <- csvIn[,4] 

lcinm <- data.matrix(inputData, rownames.force = "NA") 
lcoutm <- data.matrix(outputData, 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) 
softmax <- mx.symbol.LinearRegressionOutput(fc3, name="softmax") 

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

這是錯誤消息:

Start training with 1 devices 
[08:54:33] C:/Users/qkou/mxnet/dmlc-core/include/dmlc/logging.h:235: [08:54:33] src/ndarray/ndarray.cc:231: Check failed: from.shape() == to->shape() operands shape mismatch 
Error in exec$update.arg.arrays(arg.arrays, match.name, skip.null) : 
    [08:54:33] src/ndarray/ndarray.cc:231: Check failed: from.shape() == to->shape() operands shape mismatch 

輸入數據(3個節點)

> lcinm 
        INA   INV  INC 
    [1,] 0.327172792 0.1842063931 0.50227366 
    [2,] 0.328585645 0.1911366252 0.50394467 
    [3,] 0.329998499 0.1980668574 0.50557458 
    [4,] 0.333367019 0.1994041603 0.50606766 
    [5,] 0.338691205 0.2007416800 0.50656075 
    [6,] 0.344015391 0.2020789830 0.50705383 
    [7,] 0.345432095 0.2021049795 0.50698534 
    [8,] 0.346848798 0.2021309760 0.50691686 
    [9,] 0.348355970 0.2026784188 0.50617724 
    [10,] 0.349953611 0.2032256450 0.50542391 

輸出數據(1節點)

> lcouta 
    [1] 0.6334235 0.6336314 0.6338394 0.6339434 0.6339434 0.6339434 
    [7] 0.6306156 0.6272879 0.6241681 0.6212562 0.6183444 0.6170965 

回答

0

嘗試以下操作:

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) 
linear_reg_ output <- mx.symbol.LinearRegressionOutput(fc4, name="output") 

這裏FC4實際上是整個網絡的輸出。我們使用LinearRegressionOutput作爲最終輸出,以使網絡優化平方損失。您還可以直接使用fc4作爲輸出並編寫自己的損失函數。

+0

謝謝!工作!所以問題是我無法將3節點層連接到輸出,因此您將它連接到隱藏的1節點然後連接到輸出? – David

+0

是的。實際上fc4和linear_reg_output一起形成輸出。 – kevinthesun

0

對於FullyConnected API,num_hidden是此圖層隱藏單元的數量。要在一個網絡中定義多個隱藏層,可以這樣做:

>>> import mxnet as mx 
>>> net = mx.symbol.Variable('data') 
>>> net = mx.symbol.FullyConnected(data=net, name='fc1', num_hidden=128) 
>>> net = mx.symbol.Activation(data=net, name='relu1', act_type="relu") 
>>> net = mx.symbol.FullyConnected(data=net, name='fc2', num_hidden=64) 
>>> net = mx.symbol.Activation(data=net, name='relu2', act_type="relu") 
>>> net = mx.symbol.FullyConnected(data=net, name='fc3', num_hidden=32) 
>>> net = mx.symbol.SoftmaxOutput(data=net, name='out') 

這是用python編寫的。你應該可以做類似的事情在R.

+0

嗨,謝謝。但是這個遍佈整個地方的複製粘貼是用於分類(0/1)的RELU而不是像「sigmoid」或「tanh」那樣的迴歸 – David

+0

您可以根據需要更改激活函數類型。 net = mx.symbol.Activation(data = net,name ='tanh1',act_type =「tanh」) – kevinthesun

+0

如果更改激活類型,那麼它不起作用(它會引發錯誤),除非num_hidden = 1。 – David