Keras的LSTM层中的4D输入

时间:2018-10-22 19:03:03

标签: python tensorflow machine-learning keras lstm

我有形状为(10000, 20, 15, 4)的数据,其中num samples = 10000num series in time = 20height = 15weight = 4。因此,我有了表15x4,它随时间分布。这是我要根据数据训练的模型:

...
model.add((LSTM(nums-1,return_sequences=True,input_shape=(20,15,4), activation='relu')))
model.add((LSTM(nums-1,return_sequences=False,input_shape=(20,15,4), activation='tanh')))
model.add(Dense(15,activation='relu'))
...

但是,出现以下错误:

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, 
found ndim=4

如何定义具有4D输入形状的LSTM层?

1 个答案:

答案 0 :(得分:2)

LSTM层接受形状为(n_sample, n_timesteps, n_features)的3D数组作为输入。由于数据中每个时间步的特征都是一个(15,4)数组,因此您需要先将其展平为长度为60的特征向量,然后将其传递给模型:

X_train = X_train.reshape(10000, 20, -1)

# ...
model.add(LSTM(...,input_shape=(20,15*4), ...)) # modify input_shape accordingly

或者,您可以使用包装在Flatten中的TimeDistributed层作为模型的第一层,以在每个时间步上展平:

model.add(TimeDistributed(Flatten(input_shape=(15,4))))

此外,请注意,如果每个时间步(即数组(15, 4))都是一个要素图,其元素之间存在局部空间关系,例如图像补丁,则也可以使用ConvLSTM2D LSTM层。否则,将时间步调平并使用LSTM会很好。


作为旁注::您只需要在模型的第一层上指定input_shape参数。在其他层上进行指定将是多余的,并且将被Keras自动推断出它们的输入形状,因此将被忽略。