如何从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),或者想单独查看每个样本特征与对应类别权重的点积,可以按以下步骤操作:
- 提取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)
- 获取最后一层的权重和偏置:
w, b = model.layers[-1].get_weights() # w 形状(200,5926),每一列对应一个类别的权重向量 # b 形状(5926,),每个类别对应的偏置值
- 计算每个样本对应各类别的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
相关产品推荐
相关产品推荐

