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

如何从Keras的Softmax层提取权重?权重矩阵形状解惑

理解Keras中Dense层权重与预测的关系

首先得澄清一个关键概念:你模型最后一层的Dense权重是全局共享的参数,并不是每个预测样本独有的。每个样本的预测结果,是通过把前一层(BiLSTM)的输出特征,和这个共享的权重矩阵做矩阵运算,再加上偏置、经过Softmax得到的。

你的模型结构拆解

你的BiLSTM输出是(680, 200)形状的特征(200对应你设置的embedding_size,因为Bidirectional LSTM在return_sequences=False时,会把前向和后向的输出拼接,所以维度是2倍的units值)。最后一层Dense的权重(200,5926),每一列对应一个类别的权重向量(长度200),所有样本预测对应类别时,都会用这个列向量和自身特征做点积。

每个样本的预测计算过程可以拆解为:

# lstm_out 是BiLSTM层的输出,形状(680,200)
# w 是Dense层权重,形状(200,5926);b 是偏置,形状(5926,)
logits = lstm_out @ w + b  # 形状(680,5926),Softmax前的原始得分
predictions = softmax(logits)  # 形状(680,5926),最终概率预测结果

如何获取每个样本对应各类别的权重加权结果

如果你想要的是每个样本对应到每个类别的“权重贡献值”(也就是Softmax之前的logits),或者想单独查看每个样本特征与对应类别权重的点积,可以按以下步骤操作:

  1. 提取BiLSTM层的输出特征:
from tensorflow.keras.models import Model

# 创建新模型,专门输出BiLSTM层的结果
intermediate_model = Model(inputs=model.input, outputs=model.layers[-2].output)
lstm_outputs = intermediate_model.predict(np.array(X_test))  # 输出形状(680, 200)
  1. 获取最后一层的权重和偏置:
w, b = model.layers[-1].get_weights()
# w 形状(200,5926),每一列对应一个类别的权重向量
# b 形状(5926,),每个类别对应的偏置值
  1. 计算每个样本对应各类别的logits(Softmax前的原始得分):
import numpy as np

logits = np.dot(lstm_outputs, w) + b  # 形状(680,5926)
# 这个结果和model.predict得到的概率,是Softmax函数的输入与输出关系

如果想单独查看某个样本对应某个类别的权重点积(不加偏置),可以直接计算:np.dot(lstm_outputs[i], w[:, j]),其中i是样本索引,j是类别索引。

为什么不存在“每个预测对应的权重”

模型的权重是训练完成后固定的全局参数,所有样本都会复用同一组权重计算预测结果。你看到的(200,5926)权重矩阵,是整个模型对所有样本共享的映射规则,而非每个样本独有的权重集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:06