难以理解mxnet nn所需的矩阵布局

时间:2018-01-17 00:59:56

标签: arrays r neural-network mxnet

获得一个数据框,其中列2:37作为变量,第一列作为二元响应变量。

mx.set.seed(1234)
train.x = data.matrix(A3n.df[,2:37])
train.y = A3n.df[,1]

data <- mx.symbol.Variable("data")
fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=12)
act1 <- mx.symbol.Activation(fc1, name="relu1", act_type="relu")
fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=1)
logoutput <- mx.symbol.LogisticRegressionOutput(fc2, name="logoutput")

A1.MXmodel <- mx.model.FeedForward.create(logoutput, X=train.x, y=train.y,
                                     ctx=mx.gpu(), num.round=1000, array.batch.size=100,
                                     learning.rate=0.01, momentum=0.9,  eval.metric=mx.metric.accuracy,
                                     initializer=mx.init.uniform(0.07),
                                     epoch.end.callback=mx.callback.log.train.metric(100))

导致错误:

Error in mx.io.internal.arrayiter(as.array(data), as.array(label), unif.rnds,  : 
  io.cc:50: Seems X, y was passed in a Row major way, MXNetR adopts a column major convention.
Please pass in transpose of X instead

就在几天前我用过:

train.x <- t(train.x)

修正了错误并产生了足够低的错误率以使其可信,但今天,它几乎没有学习.50。我也试过将array.layout切换到rowmajor / colmajor而没效果。

[16] Train-accuracy=0.460714285714286
[17] Train-accuracy=0.460714285714286
[18] Train-accuracy=0.460714285714286
[19] Train-accuracy=0.460714285714286
[20] Train-accuracy=0.460714285714286
[993] Train-accuracy=0.460714285714286
[994] Train-accuracy=0.460714285714286
[995] Train-accuracy=0.460714285714286
[996] Train-accuracy=0.460714285714286
[997] Train-accuracy=0.460714285714286
[998] Train-accuracy=0.460714285714286
[999] Train-accuracy=0.460714285714286
[1000] Train-accuracy=0.460714285714286

1 个答案:

答案 0 :(得分:2)

在调用mx.model.FeedForward.create时,您需要更改一些内容才能使其正常工作:

  1. 从train.x中移除转置。
  2. 删除eval.metric = mx.metric.accuracy(如果您想查看培训进度,请将其替换为eval.metric = mx.metric.rmse)
  3. (可选)设置array.layout =“rowmajor”以指示您的示例在行中,并且功能在列中。 Mxnet足够聪明,可以自动检测它,但它会删除输出中令人讨厌的消息
  4. 最终通话将如下所示:

    A1.MXmodel <- mx.model.FeedForward.create(logoutput, X=train.x, y=train.y,
                                          ctx=mx.gpu(), num.round=1000, array.batch.size=100,
                                          learning.rate=0.01, momentum=0.9,
                                          initializer=mx.init.uniform(0.07),
                                          eval.metric=mx.metric.rmse,
                                          array.layout = "rowmajor",
                                          epoch.end.callback=mx.callback.log.train.metric(100))
    

    事实是,作为评估指标的准确性不能与逻辑回归符号的输出一起使用。如果你看一下the example on how Accuracy is calculated(对不起,只有python),你会发现每个子数组中的元素数量应该等于类的数量。但LogisticRegressionOuput只产生1个输出,因此不能直接与Accuracy指标一起使用。

    如果您仍想使用准确度指标,则需要:

    1. 将fs2的隐藏单位数设置为2(班级数)

      fc2&lt; - mx.symbol.FullyConnected(act1,name =“fc2”,num_hidden = 2)

    2. 使用SoftmaxOutput作为最后一层:

      logoutput&lt; - mx.symbol.SoftmaxOutput(fc2,name =“logoutput”)

    3. SoftmaxOutput产生的2个输出等于隐藏层中的单位数,因此可以正确计算精度。

      干杯。