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

仅用Numpy实现MNIST分类准确率仅10%,求问题排查方案

MNIST分类准确率10%的排查方案

1. 数据层面验证

  • 核对样本与标签的对应关系:随机抽取若干训练样本,打印图像和对应的标签,确认两者匹配。准确率10%接近随机猜测,大概率模型没学到有效特征,先排除数据标签错位的问题。
  • 检查归一化效果:确认像素值是否正确归一化到合理范围(比如[0,1],即原0-255像素除以255),可以打印一批样本的像素值统计(均值、最大值、最小值),避免出现全0、全1或数值范围异常的情况。
  • 确认数据集划分:检查训练集、测试集的划分是否正确,有没有出现测试集占比过高、训练数据量不足的情况,或者误将测试集用作训练数据。

2. 模型初始化检查

  • 权重初始化合理性:
    • 若用sigmoid激活,需用Xavier初始化(比如权重从N(0, sqrt(2/(输入维度+输出维度)))或均匀分布[-sqrt(6/(输入维度+输出维度)), sqrt(6/(输入维度+输出维度))]采样),避免权重过大导致神经元饱和、梯度消失。
    • 若用ReLU激活,需用He初始化(权重从N(0, sqrt(2/输入维度))采样)。
    • 绝对不能将所有权重初始化为0,否则神经元会处于对称状态,无法学到差异化特征。
  • 偏置项验证:检查前向传播时是否正确添加了偏置项,偏置初始化为0是合理的,但要确认计算逻辑中没有遗漏。

3. 前向传播逻辑排查

  • 中间层输出统计:打印每一层激活后的输出均值、方差,比如sigmoid输出若集中在0或1附近,说明神经元饱和;ReLU输出若全为0,说明出现大量死神经元,这两种情况都会导致模型无法学习。
  • Softmax层验证:
    • 确认输出维度与标签维度匹配(比如10分类任务输出10维)。
    • 检查输出的概率和是否接近1,若所有类别概率都在0.1左右,说明模型输出完全随机,没有学到特征。
  • 矩阵维度核对:确保每一层权重矩阵的维度与输入、输出维度匹配,比如输入层784维、隐藏层256维时,权重矩阵应为(784, 256)(或根据你的矩阵乘法顺序调整),避免因维度不匹配导致广播错误或无效计算。

4. 反向传播逻辑验证

  • 损失函数正确性:
    • 若用softmax+交叉熵损失,建议使用简化公式(避免数值不稳定):对于one-hot标签y,损失为-sum(y * log(softmax_output));若标签是整数形式,需对应取softmax输出中对应索引的概率再取负对数。
    • 打印每一轮的训练损失,若损失始终不变或波动无规律,说明损失计算有误。
  • 梯度数值验证:对单个权重参数,手动计算数值梯度(给参数加微小扰动epsilon,计算损失变化量除以epsilon),与反向传播得到的梯度对比,若两者差异过大,说明导数计算错误(比如sigmoid导数是否为output*(1-output),ReLU导数是否在输入>0时为1、否则为0)。
  • 权重更新逻辑:确认权重更新公式为weights -= learning_rate * gradient(若用批量梯度下降,梯度需先除以批次大小),避免写成加号导致模型发散。

5. 训练流程细节检查

  • 标签编码方式:若使用交叉熵损失,标签需为one-hot编码形式;若标签是0-9的整数,需确保损失函数适配该格式,否则损失计算无效。
  • 批次处理逻辑:使用小批量梯度下降时,需将批次内的梯度平均后再更新权重,否则梯度规模过大,模型会出现剧烈震荡。
  • 训练轮数:检查训练轮数是否足够,比如至少训练10-20轮,观察损失是否持续下降。若损失一直不变,说明前面的环节存在根本性错误。

内容的提问来源于stack exchange,提问作者Артем Бурлаченко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:56:00