使用Keras了解LSTM中的input_shape参数


20

我正在尝试使用Keras文档中描述的名为“用于序列分类的堆叠式LSTM” 的示例(请参见下面的代码),并且无法input_shape在我的数据上下文中找出参数。

我输入了一个由25个可能的字符组成的序列矩阵,以整数编码为最大长度为31的填充序列。因此,my x_train具有形状(1085420, 31)含义(n_observations, sequence_length)

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

此代码x_train中的形状(1000, 8, 16)为16个元素的8个数组的1000个数组。在那里,我完全迷失了什么是什么以及如何使数据达到这种形状。

查看Keras文档以及各种教程和问答,看来我缺少明显的东西。有人可以提示我要寻找什么吗?

谢谢你的帮助 !

Answers:


23

LSTM形状很坚硬,所以不会感到难受,我不得不花几天的时间自己与它们战斗:

如果您一次要输入1个字符的数据,则您的输入形状应为(31,1),因为您的输入有31个时间步长,每个时间步长为1个字符。您将需要将x_train从(1085420,31)重塑为(1085420,31,1),这很容易通过以下命令完成:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))

2

检查此git仓库LSTM Keras汇总图,我相信您应该一切都清楚了。

此git repo包含Keras LSTM摘要图,该图显示:

  • 使用的参数一样return_sequencesbatch_sizetime_step...
  • lstm层的真实结构
  • 喀拉拉邦这些层的概念
  • 如何操纵您的输入和输出数据以符合模型要求如何堆叠LSTM的层

和更多


谢谢你,@ MohammadFneish。这看起来现在会更有帮助。但是,尚不清楚这是否是对问题答案,而不是有用的建议。请注意,Cross Validated严格来说是一个问答网站,而不是论坛。您是否可以添加[更多]信息来解释输入的形状参数?
gung-恢复莫妮卡

3
@gung我非常感谢您设法复习这些答案以保持标准的方法,但是我认为我无法在涉及许多技术细节的情况下进一步详细说明这些参数。我只是认为我的答案可能对面临类似问题的开发人员有所帮助,而这些问题不一定是特定问题。谢谢
Mohammad Fneish

1

我知道这不是您问题的直接答案。这是一个只有一个LSTM单元的简化示例,有助于我了解输入数据的重塑操作。

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

这将是仅具有单个LSTM单元且输入数据具有特定形状的LSTM网络的示例。

事实证明,我们只是在这里进行预测,为简单起见,这里没有进行训练,而是看一下在predict方法之前我们需要如何重塑数据(以添加额外的维度)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.