PyTorch训练神经网络时多次迭代后输出相同值问题排查
你代码中的核心错误是训练循环前向传播时误用了全量训练数据而非当前批次数据,错误的损失计算导致梯度完全异常,最终网络参数坍塌,输出固定值。
具体原因
- 维度不匹配导致损失计算错误:你在循环内切出了当前批次的
X_batch(10条样本)和y_batch(10条标签),但调用net()前向传播时传入的是全量train_X,输出维度和y_batch维度不匹配,PyTorch的广播机制会生成完全不符合预期的MSE损失值,反向传播得到的梯度是完全错误的。 - 死亡ReLU神经元:错误的大梯度更新会把全连接层的参数推到异常区间,导致ReLU激活函数输入全为负,不管输入什么特征,ReLU输出都为0,后续层的输出自然变成固定值,也就是你看到的所有输出完全相同的情况。
- 你提到问题仅在执行
optimizer.step()时出现,正好印证了是错误梯度更新导致的参数异常:如果不执行参数更新,网络初始随机参数还能输出不同结果,一旦按错误梯度更新参数,几次迭代后网络就会坍塌。
修复方案
只需要把训练循环中的前向传播代码修改为使用当前批次数据即可:
# 原错误代码 # output = net(train_X) # 修改为 output = net(X_batch)
额外优化建议
如果修复后仍有类似问题,可以排查以下两点:
- 输入特征是否做了归一化,未归一化的特征也容易导致梯度异常,出现激活函数死区
- 学习率是否过高,可以适当降低到
1e-3级别测试
内容的提问来源于stack exchange,提问作者Erinç Utku Öztürk
相关产品推荐
相关产品推荐

