首页 > 解决方案 > 神经网络:需要数字/复杂矩阵/向量参数

问题描述

我使用该包neuralnet在 R 中构建分类模型。但是,我遇到了著名的错误:

Error in cbind(1, pred) %*% weights [[num_hidden_layers + 1]]:    
requires numeric/complex matrix/vector arguments

这里还有很多其他类似的问题,但没有一个能解决我的问题。这些是我正在采取的步骤:

  1. 用于model.matrix创建虚拟列(确保没有列是因子或字符串)
  2. paste按函数创建手动公式
  3. neuralnet使用步骤 1 的 one-hot-encoded 数据集和步骤 2 中创建的公式进行训练

到这里为止,一切都很好。没有错误。该模型在 5000 次迭代后收敛。但是,当我使用computeorpredict函数对测试数据进行预测时,它给了我上述错误。

我很确定这些列是相同的并且具有相同的名称。此外,每个属性的类都是数字的。我告诉自己,也许测试集没有很好地转换model.matrix,所以我在预测/计算函数中使用了相同的训练集!令人惊讶的是,它对相同的训练集给出了类似的错误!如果数据不是数字/复数矩阵,最初是如何训练的,现在无法预测?

PS:由于隐私问题,我无法共享数据。这是简化的代码:

trainset = model.matrix(~., data=train_roig)
NN_model = neuralnet(f, trainset[,-c(1:2)], hidden = c(4,2))
# NO ERROR
compute(NN_model, trainset[,-c(1:2)])
# GIVES ME THE ERROR
predict(NN_model, trainset[,-c(1:2)])
# GIVES ME THE SAME ERROR

仔细检查列名:

NN_model$model.list$variables == colnames(trainset[,-c(1:2)])
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

申请后检查trainset的结构model.matrix

str(trainset)
# num [1:134260, 1:19] 0 0 0 0 0 0 0 0 0 ... 
# -attr(*, "dimnames") = list of 2
# ..$ : chr [1:134260] "1" "2" "3" "4" ...
# ..$ : chr [1:19] "Y" "n_trips" "age" "sexM" ...

标签: rmatrixneural-network

解决方案


一个可能的问题是收敛。如果stepmax达到数量但默认threshold不满足,则模型不会产生任何权重。

用于plot(trainset)确保生成权重。如果由于缺少权重而无法绘制您的网络,那么您需要增加thresholdorstepmax以使模型适合。

此问题仅发生在neuralnet. 我使用的其他函数,即使它们不收敛,也会在最后一步之前给你最后的权重。但是,此包仅在收敛时才释放权重。


推荐阅读