【问题标题】:Keras LSTM to predict next word with variable length sequencesKeras LSTM 用可变长度序列预测下一个单词
【发布时间】:2018-05-25 10:40:17
【问题描述】:

我有一组可变长度的序列,我想构建一个模型,根据过去的许多标记来预测下一个标记。

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

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

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

【问题讨论】:

  • 我想我和你有同样的问题。我有不同大小的序列列表。模型应该根据之前的项目预测下一个项目。我不知道在使用fit 时应该如何传递目标。你解决了吗?
  • @MarcinLagowski 我最终编写了一个生成器,它产生固定大小的子序列,其中目标是下一个元素。您可以使用fit_generator() 训练模型。虽然这样可行,但它会丢弃每批之间的内部 LSTM 单元状态。
  • 所以您正在生成像(..., (seq[0:5], seq[6]), (seq[1:6], seq[7]),...) 这样的序列?您是否尝试过生成类似 (..., (seq[0:5], seq[6]), (seq[0:6], seq[7]),...) 的内容?
  • 是的,我采用了您展示的第一种方法。不,我没有尝试后一种。如果您尝试获得一些结果,请告诉我。

标签: keras deep-learning sequence lstm


【解决方案1】:

是的,您可以在 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')

关键点是批处理中的句子需要为张量操作进行填充,但实际上不同的批处理可以有不同数量的时间步长,从而允许您的模型处理不同长度的句子。

【讨论】:

  • 好的。那么在每个批次中,我应该如何预处理序列以便能够将它们用于训练? (与我在上面帖子最后一段中的问题有关)。
  • 如果您只有一个序列并且没有切任何东西,请使用TimeseriesGenerator,它将在您的序列上创建一个滑动窗口样式数据。
  • 我有多个序列,而不仅仅是一个。那么,在每个批次中,我还需要对数据进行预处理吗?如果是这样,怎么做? LSTM 将如何学习对整个序列且仅对某些窗口的依赖?
  • 那么你有 2 个选项,要么使用 pad_sequences 填充每个句子并使用 model.fit,要么编写自定义 Sequence 生成批次并且仅使用 model.fit_generator 在批次内填充。
  • 抱歉,我还是不太明白。每个序列应该包括什么?我应该把我的长序列分成子序列吗?如果我这样做了,我不会错过学习整个序列结构吗?
【解决方案2】:

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

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

【讨论】:

  • 您不需要固定的输入形状,Keras 支持可变输入长度。
  • 这不是真的。如果希望 Keras 忽略某些元素,可以使用 Maksing 或不指定时间步数,但它不适用于 Keras 的所有层。
猜你喜欢
  • 2021-04-21
  • 2019-06-04
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 2021-10-02
  • 2019-07-07
  • 2016-07-17
  • 1970-01-01
相关资源
最近更新 更多