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

机器学习神经网络分类器输出结果全相同问题及Python代码排查

解决神经网络分类器输出全相同的问题

嘿,我之前踩过一模一样的坑!结合你给出的代码片段,咱们来拆解几个最可能导致输出全一致的原因,附上调优方法:

1. 权重初始化太“随意”,导致激活函数饱和

你现在用random.rand()生成0-1之间的初始权重,对于sigmoid激活函数来说,很容易让神经元输出直接贴到0或1的饱和区——这时候梯度会趋近于0,模型根本没法更新权重,自然输出一直不变。

修复方法:用Xavier初始化(适合sigmoid/tanh)来调整权重的方差,让激活函数输出更合理:

# Xavier初始化:权重方差为1/输入神经元数,避免激活函数饱和
theta1 = np.random.randn(n2, n1+1) * np.sqrt(1/(n1+1))
theta2 = np.random.randn(K, n2+1) * np.sqrt(1/(n2+1))

2. 输入特征没做归一化/标准化

如果你的输入特征尺度差异极大(比如一个特征是0-1,另一个是1000-2000),梯度更新会被大尺度特征主导,小尺度特征的权重根本动不了,模型收敛异常。

修复方法:对输入特征做标准化,让每个特征均值为0、方差为1:

# 按列(每个特征)标准化
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)

3. 学习率(alpha)设置不合理

  • 如果alpha太大:模型权重更新会剧烈震荡,永远找不到最优解;
  • 如果alpha太小:权重更新慢到可以忽略,模型一直停留在初始随机状态。

调试建议:先从alpha=0.01开始尝试,观察损失函数Jlist的变化——如果损失一直不变,就调小;如果损失上下跳,就调大。进阶的话可以换成Adam等自适应学习率优化器。

4. 标签y的格式不对(多分类场景)

如果是多分类任务,y必须是one-hot编码的矩阵(形状为(K, m),K是类别数,m是样本数),而不是原始的类别标签(比如0、1、2...)。如果标签格式错了,损失函数计算会完全偏离,反向传播的梯度也会失效。

修复方法:把原始标签转换成one-hot:

def to_one_hot(y, K):
    one_hot = np.zeros((K, len(y)))
    for idx, label in enumerate(y):
        one_hot[label, idx] = 1
    return one_hot

y = to_one_hot(y, K)

5. 反向传播的逻辑有漏洞(代码未完成部分)

你的代码里while lit<1...没写完,得确保前向传播、损失计算、梯度更新的逻辑都正确:

完整前向传播示例:

# 前向传播
z2 = theta1 @ a1
a2 = sigmoid(z2)
a2 = np.vstack((np.ones((1, m)), a2))  # 给隐藏层加偏置项
z3 = theta2 @ a2
a3 = sigmoid(z3)  # 输出层,多分类可以换成softmax

交叉熵损失计算:

# 交叉熵损失(适配one-hot标签)
J = -1/m * np.sum(y * np.log(a3) + (1 - y) * np.log(1 - a3))
Jlist.append(J)

梯度更新示例:

# 反向传播计算梯度
dZ3 = a3 - y
dTheta2 = 1/m * dZ3 @ a2.T
dZ2 = (theta2.T @ dZ3)[1:] * (a2[1:] * (1 - a2[1:]))  # 去掉偏置项的梯度
dTheta1 = 1/m * dZ2 @ a1.T

# 更新权重
theta1 -= alpha * dTheta1
theta2 -= alpha * dTheta2

6. 迭代次数太少/损失函数没下降

如果迭代次数设置得太低(比如你代码里写的lit<1),模型还没开始学习就停止了,输出肯定一致。另外要观察Jlist的变化——如果损失一直不变,说明梯度为0(比如激活函数饱和),得回到前面的初始化/归一化步骤排查。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:43:51