如何在Keras中设置LSTM的输入

时间:2017-10-07 14:46:10

标签: keras lstm reinforcement-learning

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

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

我使用LSTM网络学习强化学习中的政策,因此我没有固定的数据集。代理人的政策将改变句子的长度。

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

1 个答案:

答案 0 :(得分: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