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

TF Keras Softmax输出层计算值与实际值不匹配及from_logits告警问询

告警含义说明

你遇到的告警是参数配置冲突导致的:

  • SparseCategoricalCrossentropy的from_logits=True参数作用是告知损失函数,传入的模型输出是未经过softmax激活的原始对数几率(logits),损失函数内部会自动执行softmax计算再求交叉熵,这种实现的数值稳定性更好。
  • 但你的模型输出层已经显式设置了activation='softmax',实际传入损失函数的是已经完成归一化的概率值,和from_logits=True的要求不符,所以框架弹出告警询问是否为故意设置。
  • 这个告警不是导致numpy手动计算结果和Keras输出不匹配的原因,二者属于完全独立的问题。

数值不匹配的根本原因

你手动实现的Softmax函数求和维度设置错误:
当前你的Softmax代码为:

def Softmax_Activation(Input):
    return np.exp(Input) / np.sum(np.exp(Input), axis=0)

这里的axis=0是按列求和,也就是把整个批次内所有样本同一类的输出值加总作为分母,完全不符合Softmax的计算逻辑:Softmax需要对每个样本单独对10个类的输出做归一化,应该按行求和,也就是axis=1,同时要加keepdims=True保证广播维度正确,修改后的代码如下:

def Softmax_Activation(Input):
    exp_val = np.exp(Input)
    return exp_val / np.sum(exp_val, axis=1, keepdims=True)

修改后计算得到的结果和Keras输出几乎完全一致,仅有的微小差异来自框架的浮点精度误差。另外你代码里的logits变量名有误,因为输出层加了softmax,该变量实际存储的是分类概率,不是原始logits。

告警修复建议

你可以选择任意一种方案解决告警,同时提升训练稳定性:

  • 方案1:保留from_logits=True,删除输出层的activation='softmax'设置,直接输出原始logits,这种方式训练数值稳定性更好,能避免softmax计算导致的梯度消失问题。
  • 方案2:保留输出层的activation='softmax',把损失函数的from_logits参数改为False。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:24:07