使用 Keras 了解 LSTM 中的 input_shape 参数

机器算法验证 lstm 喀拉斯 方面
2022-01-16 17:39:14

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

我输入了一个由 25 个可能的字符组成的序列矩阵,这些字符以整数编码为最大长度为 31 的填充序列。因此, myx_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)为 1000 个数组,其中 8 个数组包含 16 个元素。在那里,我完全迷失了我的数据是什么以及如何达到这种形状。

查看 Keras 文档以及各种教程和问答,我似乎遗漏了一些明显的东西。有人可以告诉我要寻找什么吗?

谢谢你的帮助 !

3个回答

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))

检查这个 git 存储库LSTM Keras 总结图,我相信你应该明白一切。

这个 git repo 包含一个 Keras LSTM 摘要图,显示:

  • return_sequences, batch_size, time_step... 等参数的使用
  • lstm层的真实结构
  • keras 中这些层的概念
  • 如何操作您的输入和输出数据以匹配您的模型要求如何堆叠 LSTM 的层

和更多

我知道这不是您问题的直接答案。这是一个只有一个 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方法之前重塑数据(以添加额外的维度)。