如何在不修改模型架构的情况下获取Keras模型Softmax前的输出?
获取Keras模型softmax激活前的输出(无需修改架构或重训)
你之前尝试从softmax输出反推logits的方法不可行,核心原因有两点:
- softmax具有常数不变性——给所有logits加上任意常数,softmax的输出结果完全一致,因此从probs无法唯一确定logits;
- 数值计算中,当probs趋近于0时,
log(probs)会产生严重精度损失,导致反推的logits偏差极大,最终softmax还原后和原probs不一致。
正确方法:构建输出logits的新模型
直接基于原模型结构,创建一个新模型,将输出指向原模型最后一层(softmax层)的输入,也就是softmax激活前的logits。代码如下:
import keras # 基于原模型创建logits输出模型 logits_model = keras.Model(inputs=model.input, outputs=model.layers[-1].input) # 获取softmax激活前的logits logits = logits_model.predict(X_train)
验证结果
用你自定义的softmax函数计算得到的概率,和原模型输出的probs会几乎完全一致(仅存在微小浮点精度误差):
def softmax(x): e_x = np.exp(x - np.max(x)) return e_x / e_x.sum(axis=1, keepdims=True) probabilities = softmax(logits) # 对比原模型输出 probs = model.predict(X_train) print(np.allclose(probabilities, probs, atol=1e-6)) # 输出应为True
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

