为何PyTorch线性神经网络训练中测试准确率长期无变化?
三分类线性模型训练后测试准确率固定的排查方向
线性模型的表达能力瓶颈
线性神经网络(全连接层+线性激活)只能学习线性可分的决策边界。如果你的数据集本身不满足线性可分,模型会快速收敛到局部最优,后续训练无法进一步优化,自然测试准确率保持不变。线性激活没有非线性变换,完全无法捕捉数据中的复杂模式,这是这类模型的先天局限。损失函数与输出层的适配问题
三分类任务用线性激活输出时,损失函数的选择要格外注意:- 若使用
CrossEntropyLoss,它要求输入是未经过softmax的logits,线性激活的输出(全体实数)是符合要求的,但要确保输出层维度是3(对应三类); - 若误用
MSELoss配合独热标签,线性模型的连续输出很难逼近离散的独热编码,模型会早早陷入无法优化的状态。
- 若使用
优化器与学习率设置失误
- 学习率过大:参数更新幅度过大,模型在最优值附近震荡,但线性模型的特性会让震荡后的准确率回到同一水平;
- 学习率过小:参数更新缓慢,甚至几个epoch后就完全停止更新,准确率不再变化;
- 优化器选择不当:比如用纯SGD且无动量,面对有噪声的数据,模型容易快速陷入停滞。
数据预处理缺失
如果特征没有做标准化/归一化,不同特征的数值范围差异悬殊,线性模型的参数更新会被数值大的特征主导,其他特征的权重无法有效调整,模型很快收敛到次优解,之后准确率不再变动。比如某特征范围是0-1000,另一特征是0-1,模型会优先拟合前者,完全忽略后者的信息。训练循环的逻辑漏洞
检查PyTorch训练代码的细节:- 训练时是否忘记调用
model.train()?没开启训练模式的话,模型参数不会更新; - 测试时是否没调用
model.eval()?虽然线性模型可能没有BatchNorm、Dropout这类依赖模式的层,但仍需确保测试时模型处于评估状态; - 每次训练步骤后是否调用了
optimizer.zero_grad()?梯度累积会导致参数更新异常,快速停滞; - 确认测试集数据加载是否正确,比如有没有误将训练集数据重复加载到测试集,或者测试集样本的标签是否存在异常(比如全是同一类别,但你明确不能处理数据不平衡,可快速验证排除)。
- 训练时是否忘记调用
内容的提问来源于stack exchange,提问作者average55
相关产品推荐
相关产品推荐

