首页 文章

如何使用带嵌入字的Keras LSTM来预测单词id

提问于
浏览
1

在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层的输出被馈送到具有具有softmax激活功能的 (sequence_length) 输出神经元的Dense层 . 所以输出的形状就像输入的形状即 (batch_size, sequence_length)

  • 作为一种损失,我使用输入和目标批次之间的分类交叉熵

我的问题:

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

Edit 1:

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

1 回答

  • 0

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

    您的最后一个图层必须输出 (sequence_length, dictionary_size+1) .

    如果你之前没有添加任何 Flatten()Reshape() ,你的密集层就会输出 sequence_length ,所以它应该是 Dense(dictionary_size+1)

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

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

相关问题