Python Keras:如何在LSTM模型中显示注意权重

Python Keras:如何在LSTM模型中显示注意权重,python,keras,lstm,text-classification,attention-model,Python,Keras,Lstm,Text Classification,Attention Model,我使用带有注意层的LSTM建立了一个文本分类模型。我的模型做得很好,效果也很好,但我无法在评论(输入文本)中显示每个单词的注意力权重和重要性/注意力。 用于此模型的代码为: def dot_产品(x,内核): 如果K.backend()=“tensorflow”: 返回K.squence(K.dot(x,K.expand_dims(kernel)),轴=-1) 其他: 返回K.dot(x,内核) 课堂注意力与上下文(层): """ 注意操作,带有上下文/查询向量,用于时态数据。 “用于文档分类的

我使用带有注意层的LSTM建立了一个文本分类模型。我的模型做得很好,效果也很好,但我无法在评论(输入文本)中显示每个单词的注意力权重和重要性/注意力。 用于此模型的代码为:

def dot_产品(x,内核):
如果K.backend()=“tensorflow”:
返回K.squence(K.dot(x,K.expand_dims(kernel)),轴=-1)
其他:
返回K.dot(x,内核)
课堂注意力与上下文(层):
"""
注意操作,带有上下文/查询向量,用于时态数据。
“用于文档分类的分级注意网络”
通过使用上下文向量来辅助注意
#输入形状
带形状的三维张量:(样本、步骤、特征)。
#输出形状
带形状的二维张量:(样本、特征)。
如何使用:
只需将它放在RNN层(GRU/LSTM/SimpleRN)的顶部,返回值为True。
根据RNN的输出形状推断尺寸。
注:该层已使用Keras 2.0.6进行测试
例子:
model.add(LSTM(64,返回序列=True))
model.add(AttentionWithContext())
#接下来添加一个密集层(用于分类/回归)或其他任何内容
"""
定义初始化(自我,
W_正则化器=无,u_正则化器=无,b_正则化器=无,
W_约束=无,u_约束=无,b_约束=无,
偏差=真,**千瓦格):
self.supports\u masking=True
self.init=initializers.get('glorot_uniform')
self.W_正则化器=正则化器.get(W_正则化器)
self.u\u正则化器=正则化器.get(u\u正则化器)
self.b_正则化器=正则化器.get(b_正则化器)
self.W_constraint=constraints.get(W_constraint)
self.u\u constraint=constraints.get(u\u constraint)
self.b_约束=约束.get(b_约束)
自我偏见
超级(关注上下文,自我)。\uuuuu初始化(**kwargs)
def构建(自我,输入_形状):
断言len(输入_形)==3
self.W=self.add_权重((输入_形状[-1],输入_形状[-1],),
初始值设定项=self.init,
name='{}_W'.格式(self.name),
正则化器=self.W_正则化器,
约束=self.W_约束)
如果自我偏见:
self.b=self.add_权重((输入_形状[-1],),
初始值设定项=“零”,
name='{}_b'.格式(self.name),
正则化器=self.b_正则化器,
约束=self.b_约束)
self.u=self.add_权重((输入_形状[-1],),
初始值设定项=self.init,
name='{}_'.格式(self.name),
正则化器=self.u\u正则化器,
约束=self.u_约束)
超级(关注上下文,自我)。构建(输入形状)
def计算掩码(自身、输入、输入掩码=无):
#不要将遮罩传递到下一层
一无所获
def调用(self、x、mask=None):
uit=dot_乘积(x,self.W)
如果自我偏见:
uit+=self.b
uit=K.tanh(uit)
ait=点_乘积(uit,self.u)
a=K.exp(ait)
#下一步将重新规范化exp.之后应用掩码
如果掩码不是无:
#将遮罩投射到floatX,以避免float64向上投射到场景中
a*=K.cast(掩码,K.floatx())
#在某些情况下,特别是在训练的早期阶段,总和可能几乎为零
#这就导致了楠的。一种解决方法是在总和上加一个非常小的正数ε。
#a/=K.cast(K.sum(a,axis=1,keepdims=True),K.floatx())
a/=K.cast(K.sum(a,axis=1,keepdims=True)+K.epsilon(),K.floatx())
a=K.展开尺寸(a)
加权输入=x*a
返回K.sum(加权输入,轴=1)
def计算输出形状(自身、输入形状):
返回输入_形[0],输入_形[-1]
嵌入_DIM=100
最大长度=118
巴赫大小=256
num_epochs=50
从keras.models导入模型
从keras.layers导入稠密、嵌入、输入
从keras.layers导入LSTM、双向、退出
def BidLstm():
#inp=输入(形状=(118100))
#x=嵌入(最大特征、嵌入大小、权重=[嵌入矩阵],
#可培训=错误)(inp)
model1=Sequential()
model1.add(密集型(512,输入_形=(118100)))
模型1.添加(激活('relu'))
#model1.add(展平())
#model1.add(BatchNormalization(input_shape=(100,))
model1.add(双向(LSTM(100,activation=“relu”,return\u sequences=True)))
模型1.添加(辍学(0.1))
模型1.添加(时间分布(密集(200)))
model1.add(AttentionWithContext())
模型1.添加(辍学率(0.25))
模型1.添加(密集(4,activation=“softmax”))
模型1.编译(loss='sparse'\u categorical'\u crossentropy',optimizer='adam',
指标=[‘准确度’])
模型1.摘要()
返回模式1

您可以使用自定义层的
获取权重()
方法获取所有权重的列表。你可以找到更多信息

您需要在模型创建期间对代码进行以下修改:

model1.add(TimeDistributed(Dense(200)))
atn = AttentionWithContext()
model1.add(atn)
然后,在培训后,只需使用:

atn.get_weights()[index]

将权重矩阵
W
提取为
numpy
数组(我认为
index
应该设置为
0
,但您必须自己尝试)。然后您可以使用
pyplot
imshow
/
matshow
来显示矩阵。

您可以使用自定义层的
get_weights()
方法来获取所有权重的列表。你可以找到更多信息

您需要在模型创建期间对代码进行以下修改:

model1.add(TimeDistributed(Dense(200)))
atn = AttentionWithContext()
model1.add(atn)
然后,在培训后,只需使用:

atn.get_weights()[index]
将权重矩阵
W
提取为
numpy
数组(我认为
index
应该设置为
0
,但您必须自己尝试)。然后您可以使用
pyplot
imshow
/
matshow
来显示ma