如何在Keras中设置LSTM的输入

如何在Keras中设置LSTM的输入,keras,lstm,reinforcement-learning,Keras,Lstm,Reinforcement Learning,我是Keras的新手,我发现很难理解LSTM层输入数据的形状。Keras文档说输入数据应该是3D张量,具有形状nb_样本、时间步长和输入尺寸。 我很难理解这种格式。timesteps变量是否表示网络记住的时间步数 在我的数据中,有几个时间步长会影响网络的输出,但我不知道有多少时间步长会影响网络的输出,也就是说,我不能说前10个样本会影响输出。 例如,输入可以是构成句子的单词。每个句子中的单词之间都有重要的相关性。我事先不知道句子的长度,每个句子的长度也不一样。我知道句子什么时候结束,也就是说,我

我是Keras的新手,我发现很难理解LSTM层输入数据的形状。Keras文档说输入数据应该是3D张量,具有形状nb_样本、时间步长和输入尺寸。 我很难理解这种格式。timesteps变量是否表示网络记住的时间步数

在我的数据中,有几个时间步长会影响网络的输出,但我不知道有多少时间步长会影响网络的输出,也就是说,我不能说前10个样本会影响输出。 例如,输入可以是构成句子的单词。每个句子中的单词之间都有重要的相关性。我事先不知道句子的长度,每个句子的长度也不一样。我知道句子什么时候结束,也就是说,我有一个句号表示结束。两个不同的句子对另一个没有影响-没有必要记住前一个句子

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


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

时间步长是序列的总长度

如果你在处理单词,那就是每个句子的单词量。 如果使用字符,则是每个序列的字符数

在可变句子长度的情况下,应将该维度设置为“无”:

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

带衬垫的固定长度 以相同长度分批分离的可变长度 在固定长度的情况下,创建一个没有意义的虚拟单词/字符,并将句子填充到最大长度,这样所有句子的长度都相同。然后添加一个屏蔽层,该屏蔽层将忽略该虚拟单词/字符

嵌入层已经有一个mask_zeros参数,那么,如果使用嵌入,可以将id 0设置为虚拟字符/字


在可变长度中,您只需将输入数据分成更小的批次,如下图所示:

根据您愿意花费的资源数量,您应该选择句子的最大长度,然后用0截断/填充所有示例,使其达到该长度。Keras要求它是固定的。那么在这种情况下输入形状应该是固定的吗?输入_shape=最大_句子_长度,?你应该将你的文本拆分成句子,那么你拥有的句子数量就是你的nb_样本。timesteps是单词/字符的最大数量。然后input_dim是这些单词/字符表示的大小,例如,如果使用单词嵌入,则嵌入大小为!最后一件事,如果最大句子长度是5,句子是I am Andrey,我应该把它表示为0,0,I am,Andrey吗?我认为应该是I am,Andrey,0,0,但我也看到了另一种情况。
#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