训练前馈神经网络时出现“non-conformable arguments”错误求助
搞定前馈神经网络多分类的"non-conformable arguments"错误
嘿,我帮你捋捋这个维度不匹配的问题——你遇到的这个错误,大概率是公式构建或者数据格式没对齐导致的,咱们一步步拆解解决:
先揪出错误根源
看你写的代码,核心问题可能出在这两处:
- 手动独热编码+公式的组合不对:多数神经网络包(比如
nnet)做多分类时,不需要把独热后的三个标签列(l1/l2/l3)都塞到公式左边,模型本身能自动处理因子型的分类标签,你手动做独热反而会让模型搞不清输入输出的维度。 - 公式里的筛选逻辑冗余:你用
n[!n %in% "Pred"],但train_nn里早就没有Pred列了(因为你用了train[,c(-1)]),虽然这不会直接报错,但容易让公式构建出意外的结果。
另外也得确认下数据维度:你原始训练集是57行7500列,处理后的train_nn应该是57行(3+7499)=7502列?如果模型期望标签和特征是分开的结构,你这样合并成一个数据框用公式,就会出现维度不匹配。
两种修正方案,选适合你的
方案1:让模型自动处理分类标签(最推荐)
这是最省心的方式,不用手动搞独热,直接用原始的因子型标签就行,以常用的nnet包为例:
# 先加载需要的包 library(nnet) # 把Pred转成因子(确保模型识别成分类任务) train$Pred <- as.factor(train$Pred) test$Pred <- as.factor(test$Pred) # 构建正确的公式:标签Pred ~ 所有其他特征 feature_names <- paste(names(train)[-1], collapse = " + ") f <- as.formula(paste("Pred ~", feature_names)) # 训练多分类神经网络,size是隐藏层神经元数,softmax=T开启多分类模式 modelffnn <- nnet(f, data = train, size = 10, softmax = TRUE, trace = FALSE)
方案2:坚持手动独热?那得调整输入格式
如果你一定要用自己生成的独热标签,那别用公式,直接把特征矩阵和标签矩阵分开传给模型,比如用ffnn包的话:
library(ffnn) # 单独提取独热标签矩阵 train_labels <- class.ind(as.factor(train$Pred)) # 把特征转成矩阵格式(ffnn要求输入是矩阵) train_features <- as.matrix(train[, -1]) # 直接传入特征和标签,hidden参数设置隐藏层结构 modelffnn <- ffnn(x = train_features, y = train_labels, hidden = c(10))
最后再检查这几点
- 确保训练集和测试集的特征列完全一致,别出现有的列在训练集有、测试集没有的情况
- 检查数据里有没有缺失值,缺失值可能偷偷导致维度异常
- 你这特征维度很高(7500列),如果训练起来慢或者效果差,可以先试试PCA降维,减少特征数量再训练
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

