首页 > 解决方案 > 关于如何为 lstm 塑造数据的建议

问题描述

我有一个由 933 个矩阵组成的时间序列,每个矩阵都是一个 8x10 矩阵。这是我的 X(输入)。所以 X 有形状 (933, 8, 10)。Y(输出)是 933 个向量的时间序列,每个向量是一个 5 维向量。所以 Y 有形状 (933, 1, 5)。

我还可以重塑数据(我应该吗?),例如 X 是 (933, 80) 和 Y 是 (933, 5) 因为最终它只是一组 80 个数字的 933 个样本用于输入(想象 80 个像素在一个矩阵中)和一组 5 个数字的 933 个样本用于输出。

我正在写一个 CNN-LSTM。我仍然不知道训练/测试的大小,现在假设我想使用所有 933 个样本进行训练。我的模型是:

model = Sequential()
# define CNN model
model.add(TimeDistributed(Conv2D(1, (2,2), activation='relu', padding='same', input_shape=(None,8,10))))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Flatten()))
# define LSTM model
model.add(LSTM(933, activation='relu', input_shape=(8,10)))       
model.add(Dense(5))
model.compile(optimizer='adam', loss='mse')
model.fit(X, Y)

我收到以下错误:ValueError: input tensor must have rank 4。

我的问题是为什么我会收到这个错误,我该如何解决这个问题?

标签: pythontensorflowkerasregressionlstm

解决方案


对于 LSTM,输入必须3D(samples, time steps, features).
在您的情况下,您需要将数据重塑为(933,8,10)

在 LSTM 层中,参数input_shape采用两个值的元组,定义 和 的time steps数量features。在你的情况下,这将是(8,10)

您可以提及任何 LSTM 层的单元数,通常是 32,64 或 128 范围。单元过多不会帮助模型学习。

下面是您的数据的示例 LSTM 层。

data.shape= (933,8,10) 

model = Sequential()
model.add(LSTM(32, input_shape=(8, 10)))
model.add(Dense(5))
model.compile(optimizer='adam', loss='mse')
model.fit(X, Y)

推荐阅读