在Keras中使用LSTM获得用于文本分类的单词的概率

在Keras中使用LSTM获得用于文本分类的单词的概率,keras,classification,lstm,analysis,Keras,Classification,Lstm,Analysis,我正在使用LSTM和Keras进行情感分类,我想获得LSTM分配给句子中每个单词的概率,以便知道哪些单词更具代表性 例如,对于以下句子: “这片风景优美而宁静” 我认为将句子分类为阳性的最有代表性的词是“美妙”和“镇静”两个词。p> 如何获得LSTM分配给每个单词的概率 lstm_layer = layers.LSTM(size)(embedding_layer) output_layer1 = layers.Dense(50, activation=activation)(lstm_laye

我正在使用LSTM和Keras进行情感分类,我想获得LSTM分配给句子中每个单词的概率,以便知道哪些单词更具代表性

例如,对于以下句子:

“这片风景优美而宁静”

我认为将句子分类为阳性的最有代表性的词是“美妙”和“镇静”两个词。p> 如何获得LSTM分配给每个单词的概率

lstm_layer = layers.LSTM(size)(embedding_layer)

output_layer1 = layers.Dense(50, activation=activation)(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)

model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizer, loss='binary_crossentropy')

谢谢

您可以从最后一层(使用softmax的密集层)获得概率。示例模型:

导入keras
将keras.layers导入为L
#实例化序列模型
model=keras.models.Sequential()
#定义输入层
model.add(L.InputLayer([None],dtype='int32'))
#定义字典大小为“len(所有_单词)”和50个特征/单元的嵌入层
模型.添加(L.嵌入(len(所有单词),50))
#定义具有64个输出单元的完全连接RNN。关键是:我们返回每个时间步的RNN输出,而不仅仅是最后一个时间步
model.add(L.SimpleRNN(64,返回序列=True))
#定义“len(所有_字)”输出和softmax激活的密集层
#这将生成大小为len的向量(所有_字)
逐步密集=L.密集(len(所有单词),激活='softmax')
#TimeDistributed层向稠密层添加一个时间维度,以便在每个批次的时间维度上应用它
#也就是说,TimeDistributed将密集层独立地应用于每个时间步(输入字)。如果没有它,密集层将只对所有连接的时间步长应用一次。
#因此,对于给定的时间步长(输入单词),输出向量中的每个元素“i”都是目标词典中第i个单词的概率
逐步密度=L.时间分布(逐步密度)
模型.添加(逐步加密)
然后,编译并拟合(训练)您的模型:

model.compile('adam','categorical\u crossentropy')
模型拟合生成器(生成批次(序列数据)、len(序列数据)/批次大小,
回调=[EvaluateAccuracy()],epochs=5,)
最后-只需使用预测函数即可获得概率:

model.predict(输入你的网络)

需要明确的是,softmax层的第i个输出单位表示第i个类的预测概率。

您可以从最后一个层(具有softmax的密集层)获得概率。示例模型:

导入keras
将keras.layers导入为L
#实例化序列模型
model=keras.models.Sequential()
#定义输入层
model.add(L.InputLayer([None],dtype='int32'))
#定义字典大小为“len(所有_单词)”和50个特征/单元的嵌入层
模型.添加(L.嵌入(len(所有单词),50))
#定义具有64个输出单元的完全连接RNN。关键是:我们返回每个时间步的RNN输出,而不仅仅是最后一个时间步
model.add(L.SimpleRNN(64,返回序列=True))
#定义“len(所有_字)”输出和softmax激活的密集层
#这将生成大小为len的向量(所有_字)
逐步密集=L.密集(len(所有单词),激活='softmax')
#TimeDistributed层向稠密层添加一个时间维度,以便在每个批次的时间维度上应用它
#也就是说,TimeDistributed将密集层独立地应用于每个时间步(输入字)。如果没有它,密集层将只对所有连接的时间步长应用一次。
#因此,对于给定的时间步长(输入单词),输出向量中的每个元素“i”都是目标词典中第i个单词的概率
逐步密度=L.时间分布(逐步密度)
模型.添加(逐步加密)
然后,编译并拟合(训练)您的模型:

model.compile('adam','categorical\u crossentropy')
模型拟合生成器(生成批次(序列数据)、len(序列数据)/批次大小,
回调=[EvaluateAccuracy()],epochs=5,)
最后-只需使用预测函数即可获得概率:

model.predict(输入你的网络)

需要明确的是,softmax层的第i个输出单位表示第i个类的预测概率。

非常感谢。你举的例子是得到句子中每个单词的概率,还是完整句子的概率?你能告诉我如何修改代码吗?我在我的问题中写的。只是在我的代码中添加了澄清的注释。也就是说,对于每个时间步(在给定的句子中输入单词),我的答案中的模型将计算一个概率向量。该向量中的每个概率i表示目标词典中输入单词的第i个单词的可能性。我调整了代码,但得到以下错误:AssertionError这是我的代码:emb_层=SpatialDropout1D(0.3)(嵌入层)lstm_层=lstm(size,return\u sequences=True)(embedding\u layer)output\u layer=TimeDistributed(layers.Dense(len(word\u index)+1,activation=“softmax”)(lstm\u layer)model=models.model(inputs=input\u layer,outputs=output\u layer)model.compile(opt=opt,loss='categorical\u crossentrophy'))嗨,我回答了你贴出的问题。。。“我如何获得LSTM分配给每个单词的概率?"。因此,您接下来的步骤是对您的模型进行专门的故障排除,然后使用model.predict获取概率非常感谢。您展示的示例是获取句子中每个单词或整个句子的概率?您能告诉我如何调整代码吗?我在问题中编写了它。只是在下面的示例中添加了澄清性注释我的代码。即,对于每个时间步(给定句子中的输入单词),我的答案中的模型将计算一个概率向量。该向量中的每个概率I表示目标词典中输入单词的第I个单词的可能性。我调整代码,但我得到以下错误: