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
相关产品推荐
相关产品推荐

