CNN-LSTM模型在喀拉拉邦的序列到序列分类

时间:2020-10-10 18:00:46

标签: keras classification lstm cnn

我正在处理1000个样本。每个样本都与一个人相关,该人在168个不同的时间步长中具有70种不同的生命体征和健康特征。然后,对于每个时间步长,我都应该预测一个二进制标签。因此,输入和输出形状为:

Input.shape = (1000, 168, 70)
Output.shape = (1000, 168, 1) 

目标是使用CNN提取特征,然后将LSTM应用于时间信息。然后,我想为二进制分类应用密集层。我想为此任务应用CNN-LSTM模型。

以下是我尝试的代码。

model = Sequential()                        
model.add(Conv1D(filters=16, kernel_size=5, strides=1, padding="same", input_shape=(168, 70), activation='relu'))
model.add(MaxPooling1D())
model.add(LSTM(64, return_sequences=True))
model.add(Dense(1, activation="sigmoid")) 

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train_3D, Y_train_3D, batch_size=32, epochs=500, validation_data=(X_val_3D, Y_val_3D))

我是该模型的应用程序的新手,所以我确定自己在做错了一些我找不到的错误。这是错误:

ValueError: logits and labels must have the same shape ((None, 84, 1) vs (None, 168, 1))

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于您使用的是return_sequences=True,因此LSTM将返回形状为(batch_size, 84, 64)的输出。这里的84来自您使用的Conv1D参数。因此,当您以Dense个单位应用1层时,它将最后一个尺寸减小为1,这意味着(batch_size, 84, 64)将在(batch_size, 84, 1)之后变成Dense层应用程序。在将输出馈送到return_sequences=True层之前,您不应该使用Dense或使用另一个或多个图层将输出展平为2维。