在 keras 中使用 CNN-LSTM 模型进行序列到序列分类

Posted

技术标签:

【中文标题】在 keras 中使用 CNN-LSTM 模型进行序列到序列分类【英文标题】:Sequence to Sequence classification with CNN-LSTM model in keras 【发布时间】:2021-01-25 12:19:50 【问题描述】:

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

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】:

由于您使用的是return_sequences=True,这意味着LSTM 将返回形状为(batch_size, 84, 64) 的输出。这里的84 是由于您使用了Conv1D 参数。所以当你应用Dense 层和1 单位时,它会将最后一个维度减少到1,这意味着(batch_size, 84, 64)Dense 层应用后将变为(batch_size, 84, 1)。您要么不应该使用return_sequences=True,要么使用另一个/多个图层将输出展平为二维,然后再将其馈送到Dense 图层。

【讨论】:

以上是关于在 keras 中使用 CNN-LSTM 模型进行序列到序列分类的主要内容,如果未能解决你的问题,请参考以下文章

Keras CNN-LSTM:制作 y_train 时出错

如何在 CNN-LSTM 模型上应用 model.fit() 函数?

CNN-LSTM图像分类

解读:一种基于CNN-LSTM混合神经网络的股价预测模型

PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)

基于注意力机制的CNN-LSTM模型及其应用(含软硬注意力区别)