3 回答
TA贡献1856条经验 获得超17个赞
看完以上综合答案,我终于明白了如何提取注意力层的权重。总的来说,@李翔和@Okorimi Manoury 的想法都是正确的。对于@Okorimi Manoury 的代码段,来自以下链接:Textual attention visualization。
现在,让我逐步解释该过程:
(1). 你应该有一个训练有素的模型,你需要加载模型并提取注意力层的权重。要提取某些层权重,您可以使用model.summary()
来检查模型架构。然后,您可以使用:
layer_weights = model.layers[3].get_weights() #suppose your attention layer is the third layer
layer_weights
是一个列表,例如对于HAN注意力的词级注意力,该列表layer_weights
具有三个元素:W、b和u。换句话说,layer_weights[0] = W, layer_weights[1] = b, and layer_weights[2] = u
。
(2). 您还需要在注意力层之前获得层输出。在这个例子中,我们需要得到第二层输出。您可以使用以下代码执行以下操作:
new_model = Model(inputs=model.input, outputs=model.layers[2].output)
output_before_att = new_model.predict(x_test_sample) #extract layer output
(3). 查看详情:假设你输入的是一个100字300维度的文本段(输入是[100, 300]),第二层之后维度是128,那么形状output_before_att
就是[100, 128]。相应地,layer_weights[0]
(W)为[128, 128],layer_weights[1]
(b)为[1, 128],layer_weights[2]
(u)为[1,128]。然后,我们需要以下代码:
eij = np.tanh(np.dot(output_before_att, layer_weights[0]) + layer_weights[1]) #Eq.(5) in the paper
eij = np.dot(eij, layer_weights[2]) #Eq.(6)
eij = eij.reshape((eij.shape[0], eij.shape[1])) # reshape the vector
ai = np.exp(eij) #Eq.(6)
weights = ai / np.sum(ai) # Eq.(6)
这weights
是一个列表(100 维),每个元素是 100 个输入词的注意力权重(重要性)。之后,您可以可视化注意力权重。
希望我的解释能帮到你。
TA贡献1995条经验 获得超2个赞
您可以使用get_weights()自定义图层的方法来获取所有权重的列表。您可以在此处找到更多信息。
您需要在模型创建期间对代码进行以下修改:
model1.add(TimeDistributed(Dense(200)))
atn = AttentionWithContext()
model1.add(atn)
然后,训练后,只需使用:
atn.get_weights()[index]
将权重矩阵提取W为numpy数组(我认为index应该设置为0,但您必须自己尝试)。然后你可以使用pyplot's imshow/matshow 方法来显示矩阵。
添加回答
举报