Keras LSTM用可变长度序列预测下一个单词

时间:2018-05-25 10:40:17

标签: keras deep-learning sequence lstm

我有一组可变长度的序列,我想建立一个模型来预测给定过去许多令牌的下一个令牌。

问题是,如何训练具有可变长度序列的模型?

我知道填充但是,有没有办法不预先指定窗口长度?

我还读过关于使用batch_size = 1的内容。在这种情况下,train_X和train_Y应该是什么?如果我仅使用一个很长序列的最后一个标记作为目标,它就像我丢弃其中的所有子序列(即从0-> 1,0-> 2 ...... 0→N-1)。我应该在喂LSTM之前手动创建所有这些子序列吗?

2 个答案:

答案 0 :(得分:0)

是的,您可以在Keras中指定可变长度输入,即指定input_shape=(None, features),其中None表示未知时间步数。这是一个示例模型:

in = Input(shape=(None, num_words)) # let's assume it is one-hot encoded words
latent = Masking()(in) # sentences in same batch need to same length, padded
latent = LSTM(latent_size)(latent) # skips masked timesteps
out = Dense(num_words, activation='softmax')
model = Model(in, out)
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

关键的一点是,批量句子需要填充张量操作,但实际上不同的批次可以有不同的时间步数,允许你的模型处理不同长度的句子。

答案 1 :(得分:-1)

在keras中,您需要条形输入形状,但您可以填充序列(例如填充0)以具有相同的大小。

LSTM采用3d输入:( batch_size,timesteps,features)。时间步长代表单词,并以单个单词的表示为特征。让我们假设您有20个单词的句子,并且句子的每个单词都表示为1000个元素的OneHot向量。对于单个句子,您的输入形状必须是(1,20,1000)。您可以手动预处理数据以适应这些条件,或者您可以在keras中使用预先构建的功能来为您完成工作。您可以在此处找到所有这些功能:https://keras.io/preprocessing/text/