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

自研神经网络无法解决MNIST问题,求调试协助

问题排查与修正方案

1. Matrix类静态multiply方法的致命错误

在Matrix类的静态multiply(Matrix m, float n)方法中,错误调用了add(n)而非multiply(n),直接破坏了权重更新的计算逻辑:

public static Matrix multiply(Matrix m, float n) {
    Matrix newM = m.copy();
    newM.add(n); // 此处应为newM.multiply(n)
    return newM;
}

修正后代码:

public static Matrix multiply(Matrix m, float n) {
    Matrix newM = m.copy();
    newM.multiply(n);
    return newM;
}

2. 权重初始化范围过大

当前权重初始化为[-1,1]的随机值,对于sigmoid激活函数来说,会导致多数神经元输入值绝对值过大,进入饱和区——此时sigmoid导数y*(1-y)接近0,梯度消失,网络无法有效学习。

修正方案:缩小初始化范围,或使用Xavier初始化(针对sigmoid的优化初始化方式):

// Layer构造函数中替换权重初始化逻辑
float scale = (float) Math.sqrt(1.0 / input_size);
this.weights.apply(x -> (float) ThreadLocalRandom.current().nextDouble(-scale, scale));

3. 训练轮次严重不足

当前仅对60000个样本进行一轮遍历,MNIST这类复杂任务需要多轮迭代才能收敛。需添加多轮训练循环:

// 示例:训练10轮
for (int epoch = 0; epoch < 10; epoch++) {
    network.train(training_data, training_labels);
    // 可选:每轮后输出成本或验证集准确率,监控训练进度
}

4. 标签目标值设置不合理

输入像素被映射到[0.01, 1],但标签直接设为1——sigmoid输出永远无法达到1,会导致输出层神经元长期饱和,梯度更新效率低下。应将标签目标值调整为0.99,同时将非目标位置设为0.01:

// 标签生成代码修改
Matrix answerMatrix = new Matrix(10, 1);
for (int i = 0; i < 10; i++) {
    answerMatrix.matrix[i][0] = i == value ? 0.99f : 0.01f;
}
training_labels[count++] = answerMatrix;

5. 可选优化:小批量梯度下降

当前使用逐样本更新的随机梯度下降,训练稳定性较差。可改为小批量梯度下降,积累多个样本的梯度后再更新权重,提升训练效率。


按上述修正后,重新训练即可看到网络输出逐渐收敛,准确率逐步提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:05:36