2017-10-07 110 views
0

我是新来Keras,我觉得很难理解LSTM layer.The Keras文档的输入数据的形状说,输入数据应该是三维张量形状(nb_samples,timeteps,input_dim)。 我很难理解这种格式。时间步长变量是否表示网络记录的时间步数?如何设置输入LSTM在Keras

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

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

我应该如何塑造我的数据?它应该如何馈入Keras LSTM层?

+0

取决于你有多少资源,愿意消费,你应该选择句子的最大长度,然后截断/用这个长度填充0个例子。凯拉斯要求它是固定的。 –

+0

在这种情况下,输入形状应该如何? input_shape =(maximum_sentence_length,)? –

+0

你应该把你的文本分成几个句子,然后你的句子数量是你的'nb_samples'。 '时间步长'是单词/字符的最大数量。然后'input_dim'是这些单词/字符表示的大小(例如,如果使用单词嵌入,嵌入大小) –

回答

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可变lenghts工作的两种可能的方式。

  • 固定长度,填充
  • 可变长度分批与相同长度的

分离在固定长度的情况下,您可以创建一个虚拟字/字符是没有意义的,并填写你的句子到最大长度,所以所有的句子都有相同的长度。然后添加一个Masking()层,该层将忽略该虚字/ char。

Embedding图层已经有mask_zeros参数,那么,如果使用嵌入操作,则可以使id 0为虚拟字符/字。

在变长,你只是在小批量分离输入数据,就像这里:Keras misinterprets training data shape