我正在处理 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))
由于您使用的是
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
层。