如何使用Keras LSTM与word嵌入来预测单词id

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Keras LSTM与word嵌入来预测单词id相关的知识,希望对你有一定的参考价值。

在Keras中使用单词嵌入时,我在理解如何获得正确输出时遇到问题。我的设置如下:

  • 我的输入是批量形状(batch_size, sequence_length)。批处理中的每一行代表一个句子,该单词由单词id表示。句子用零填充,使得所有句子都具有相同的长度。例如,(3,6)输入批次可能看起来像:np.array([[135600],[174580],[138272]])
  • 我的目标由输入批次向右移动一步给出。因此,对于每个输入单词,我想预测下一个单词:np.array([[356000],[745800],[382720]])
  • 我将这样的输入批量输入Keras嵌入层。我的嵌入大小是100,所以输出将是形状(batch_size, sequence_length, embedding_size)的3D张量。所以在这个小例子中它的(3,6,100)
  • 该3D批次被送入LSTM层
  • LSTM层的输出被馈送到Dense层,其中(sequence_length)输出神经元具有softmax激活函数。所以输出的形状就像输入的形状,即(batch_size, sequence_length)
  • 作为一种损失,我使用输入和目标批次之间的分类交叉熵

我的问题:

由于softmax激活功能,输出批次将包含概率。但我想要的是网络预测整数,使输出适合目标批次的整数。如何“解码”输出,以便我知道网络正在预测哪个词?或者我必须以不同方式构建网络?

编辑1:

我已将输出和目标批次从2D数组更改为3D张量。因此,我现在使用的是单热编码的3D目标张量(batch_size, sequence_length),而不是使用具有整数id的目标批量(batch_size, sequence_length, vocab_size)。为了获得与网络输出相同的格式,我将网络更改为输出序列(通过在LSTM层中设置return_sequences=True)。此外,输出神经元的数量变为vocab_size,使得输出层现在产生一批大小的(batch_size, sequence_length, vocab_size)。通过这种3D编码,我可以使用tf.argmax(outputs, 2)获得预测的单词id。这种方法目前似乎有效,但我仍然感兴趣是否可以保留2D目标/输出

答案

一,解决方案,也许不是最好的,是输出你的字典大小的单热矢量(包括虚拟单词)。

你的最后一层必须输出(sequence_length, dictionary_size+1)

如果你没有在它之前添加任何sequence_lengthFlatten(),你的密集层将已经输出Reshape(),所以它应该是一个Dense(dictionary_size+1)

您可以使用函数keras.utils.to_categorical()转换单热矢量中的整数,并使用keras.backend.argmax()将one = hot矢量转换为整数。

不幸的是,这有点打开你的嵌入包。如果有可能进行反向嵌入或类似的东西会很好。

以上是关于如何使用Keras LSTM与word嵌入来预测单词id的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras LSTM 中使用自定义嵌入?

使用带有 LSTM 的预训练 word2vec 进行单词生成

Keras LSTM:如何预测超越验证与预测?

用于 Keras 中句子相似性的具有 LSTM 的连体网络定期给出相同的结果

如何使用 LSTM Keras 预测未来库存

在 keras 中使用预训练的 gensim Word2vec 嵌入