【问题标题】:How to set the input for LSTM in Keras如何在 Keras 中设置 LSTM 的输入
【发布时间】:2018-03-19 04:32:46
【问题描述】:

我是 Keras 的新手,我很难理解 LSTM 层的输入数据的形状。Keras 文档说输入数据应该是具有形状(nb_samples、timesteps、input_dim)的 3D 张量。 我无法理解这种格式。 timesteps 变量是否代表网络记住的时间步数?

在我的数据中,一些时间步长会影响网络的输出,但我不知道提前多少,即我不能说前 10 个样本会影响输出。 例如,输入可以是构成句子的单词。每个句子中的单词之间存在重要的相关性。我事先不知道句子的长度,这个长度也因句子而异。我确实知道句子何时结束(即我有一个表示结束的句号)。两个不同的句子相互之间没有影响 - 不需要记住前一个句子。

我正在使用 LSTM 网络来学习强化学习中的策略,所以我没有固定的数据集。代理的策略会改变句子的长度。

我应该如何塑造我的数据?应该如何输入到 Keras LSTM 层?

【问题讨论】:

  • 根据您愿意花费多少资源,您应该选择句子的最大长度,然后将所有示例截断/填充为 0 到该长度。 Keras 要求修复它。
  • 那么输入形状应该是这种情况吗? input_shape= (maximum_sentence_length, )?
  • 你应该把你的文本分成句子,那么你的句子数量就是你的nb_samplestimesteps 是单词/字符的最大数量。然后input_dim 是这些词/字符的表示的大小(例如,如果您使用词嵌入,则嵌入大小)
  • 谢谢!最后一件事,如果最大句子长度是 5 并且句子是“I am Andrey”,我应该将其表示为 (0,0, I, am, Andrey)?
  • (在我看来)应该是(I, am, Andrey, 0, 0),但我也看到了另一种方式。

标签: keras lstm reinforcement-learning


【解决方案1】:

时间步长是序列的总长度。

如果您使用的是单词,则它是每个句子的单词数量。
如果您正在使用字符,则它是每个序列的字符数量。

在可变句子长度的情况下,您应该将该维度设置为None

#for functional API models:
inputTensor = Input((None,input_dim)) #the nb_samples doesn't participate in this definition

#for sequential models:
LSTM(units, input_shape=(None,input_dim)) #the nb_samples doesn't participate in this definition

在 keras 中使用可变长度有两种可能的方法。

  • 带填充的固定长度
  • 可变长度分批以相同长度分隔

在固定长度的情况下,您创建了一个无意义的虚拟单词/字符,并将您的句子填充到最大长度,因此所有句子的长度都相同。然后添加一个Masking() 层,它将忽略该虚拟单词/字符。

Embedding 层已经有一个mask_zeros 参数,然后,如果使用嵌入,您可以将 id 0 设置为虚拟字符/单词。

在可变长度中,您只需将输入数据分成较小的批次,如下所示:Keras misinterprets training data shape

【讨论】:

    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2017-12-11
    • 2018-06-05
    • 1970-01-01
    • 2018-09-24
    相关资源
    最近更新 更多