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

问题描述 投票:0回答:1

我正在处理 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))
keras classification lstm conv-neural-network
1个回答
2
投票

由于您使用的是

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
层。

© www.soinside.com 2019 - 2024. All rights reserved.