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

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层
    )

单批次输出同一类别且概率接近的原因

结合你的代码细节,主要有以下几个触发因素:

  1. 额外Softmax导致的梯度异常
    如前所述,CrossEntropyLoss与外部Softmax的组合会让损失函数的梯度出现异常,模型无法有效学习到数据的特征差异,最终输出趋于一致。
  2. 学习率设置过高
    Adam优化器的默认学习率为0.001,你设置的lr=0.07远高于常规取值。过高的学习率会导致模型参数更新时剧烈震荡,甚至直接跳过最优解,模型根本无法收敛,输出只能维持随机或一致的状态。建议先将学习率调整为0.001或更小的数值测试。
  3. 模型初始化或数据预处理缺失
    • 如果全连接层的权重初始化过于均匀,初始阶段模型输出本身就不会有明显差异。
    • 若输入数据未做标准化/归一化处理,特征值的尺度差异过大,会导致模型难以捕捉有效特征,最终输出偏向同一类别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:35:23