You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

neuralnet包MNIST数据集预测异常求助:输出全为1且仅单列

解决neuralnet处理MNIST多分类时输出异常的问题

核心问题分析

你遇到的问题根源是neuralnet默认适配二分类/回归任务,处理10分类时需要手动调整多分类逻辑,未做标签的one-hot编码和正确的模型公式定义,导致模型误判任务类型,输出不符合预期。

具体解决步骤

  • 步骤1:将标签转换为One-Hot编码
    MNIST原始标签是0-9的数值列,必须转换成10列二进制编码(每列对应一个数字类别),示例代码:

    # 假设原始数据框为mnist_data,标签列名为label
    mnist_onehot <- model.matrix(~ factor(label) - 1, data = mnist_data)
    # 合并one-hot编码到原数据,移除原始label列
    mnist_processed <- cbind(mnist_data[, -1], mnist_onehot)
    # 重命名one-hot列便于识别
    colnames(mnist_processed)[(ncol(mnist_data)):(ncol(mnist_processed))] <- paste0("class_", 0:9)
    
  • 步骤2:构建正确的多分类模型公式
    必须把所有10个one-hot输出列放在公式左侧,示例如下:

    # 拼接输出列字符串
    output_cols <- paste0("class_", 0:9, collapse = " + ")
    # 生成完整公式
    model_formula <- as.formula(paste(output_cols, "~ ."))
    
  • 步骤3:正确训练神经网络
    确保设置linear.output = FALSE(logistic激活函数输出概率),并指定隐藏层节点数:

    library(neuralnet)
    # 假设训练集为train_data,验证集为val_data
    nn_model <- neuralnet(
      formula = model_formula,
      data = train_data,
      hidden = c(128), # 可按需调整隐藏层节点数
      act.fct = "logistic",
      linear.output = FALSE,
      rep = 1 # 训练次数,可根据需求增加
    )
    
  • 步骤4:正确执行预测并解析结果
    使用compute函数预测后,net.result会返回10列概率矩阵,对应0-9每个类别的概率:

    # 提取验证集中的特征列(排除one-hot标签列)
    val_features <- val_data[, !colnames(val_data) %in% paste0("class_", 0:9)]
    nn_pred <- compute(nn_model, val_features)
    # 获取10列概率矩阵
    prob_matrix <- nn_pred$net.result
    # 可选:将概率转换为预测类别(取概率最大值对应的数字)
    pred_labels <- apply(prob_matrix, 1, function(x) which.max(x) - 1)
    

额外注意事项

  • 过滤方差为0的特征后,需确认剩余特征均为数值型,无非数值干扰项。
  • 标准化仅针对像素特征列,one-hot编码的标签列无需标准化。
  • 隐藏层节点数可根据效果调整,MNIST任务通常用128或256节点的隐藏层表现较好。

内容的提问来源于stack exchange,提问作者Lous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:52:46