获得一个数据框,其中列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
答案 0 :(得分:2)
在调用mx.model.FeedForward.create时,您需要更改一些内容才能使其正常工作:
最终通话将如下所示:
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指标一起使用。
如果您仍想使用准确度指标,则需要:
将fs2的隐藏单位数设置为2(班级数)
fc2&lt; - mx.symbol.FullyConnected(act1,name =“fc2”,num_hidden = 2)
使用SoftmaxOutput作为最后一层:
logoutput&lt; - mx.symbol.SoftmaxOutput(fc2,name =“logoutput”)
SoftmaxOutput产生的2个输出等于隐藏层中的单位数,因此可以正确计算精度。
干杯。