【问题标题】:R mxnet create a 3 input 1 output regression with 3x3 hidden layersR mxnet 创建具有 3x3 隐藏层的 3 输入 1 输出回归
【发布时间】:2017-06-01 23:27:28
【问题描述】:

我有一个包含 4 列的 CSV 文件。 3 个输入和 1 个输出。已经正常化了。我可以使用 nnet 和神经网络来训练一个具有 3 个输入、3 个隐藏层、每个具有 3 个节点和一个输出的网络。它有效。

我想对 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

【问题讨论】:

    标签: r neural-network mxnet


    【解决方案1】:

    对于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 中做类似的事情。

    【讨论】:

    • 嗨,谢谢。但是这个到处都是的复制粘贴是用于 RELU 的,它用于分类(0/1)而不是像“sigmoid”或“tanh”这样的回归
    • 您可以根据需要更改激活函数类型。 net = mx.symbol.Activation(data=net, name='tanh1', act_type="tanh")
    • 如果您更改激活类型,则除非 num_hidden=1,否则它将不起作用(它会引发错误)。
    • num_hidden 与激活函数的类型无关,因为 act 函数仅用于元素乘法。你能发布你的代码吗?
    • 它与你的相同,但不是“relu”而是说“sigmoid”尝试那样,你应该得到一个错误。如果你不这样做,我会发布我的代码和输出。
    【解决方案2】:

    尝试以下方法:

    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 作为输出并编写自己的损失函数。

    【讨论】:

    • 谢谢!那行得通!所以问题是我无法将 3 节点层连接到输出,所以您将其连接到隐藏的 1 节点,然后连接到输出?
    • 是的。实际上 fc4 和 linear_reg_output 一起构成了输出。
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2020-10-13
    • 2018-01-30
    • 2019-10-08
    • 2013-11-10
    • 2019-05-29
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多