Softmax与CrossEntropyLoss搭配是否正确?模型输出异常排查
问题解答
Softmax的使用方式不正确
PyTorch里的nn.CrossEntropyLoss()本身就集成了LogSoftmax和NLLLoss的计算逻辑,它要求模型最后一层直接输出未经激活的logits值即可。你在分类器末尾额外添加Softmax(dim=1)属于错误用法,会引发两个核心问题:
- 损失计算时会重复执行Softmax相关运算,打乱正常的梯度传递逻辑,导致模型训练不稳定。
- 数值层面容易出现饱和现象,大幅降低梯度更新的有效性,让模型无法正常学习特征差异。
正确的分类器结构应该移除末尾的Softmax层:
self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(in_features = 32*8*8, out_features = 26), nn.ReLU(), nn.Linear(in_features = 26, out_features = output_shape) # 移除Softmax层 )
单批次输出同一类别且概率接近的原因
结合你的代码细节,主要有以下几个触发因素:
- 额外Softmax导致的梯度异常
如前所述,CrossEntropyLoss与外部Softmax的组合会让损失函数的梯度出现异常,模型无法有效学习到数据的特征差异,最终输出趋于一致。 - 学习率设置过高
Adam优化器的默认学习率为0.001,你设置的lr=0.07远高于常规取值。过高的学习率会导致模型参数更新时剧烈震荡,甚至直接跳过最优解,模型根本无法收敛,输出只能维持随机或一致的状态。建议先将学习率调整为0.001或更小的数值测试。 - 模型初始化或数据预处理缺失
- 如果全连接层的权重初始化过于均匀,初始阶段模型输出本身就不会有明显差异。
- 若输入数据未做标准化/归一化处理,特征值的尺度差异过大,会导致模型难以捕捉有效特征,最终输出偏向同一类别。
内容的提问来源于stack exchange,提问作者UrDailyCS
相关产品推荐
相关产品推荐

