在keras中使用CNN-LSTM模型进行序列到序列分类
Sequence to Sequence classification with CNN-LSTM model in keras
我正在处理 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
将 return 具有形状 (batch_size, 84, 64)
的输出。这里的 84
由于您使用了 Conv1D
参数。因此,当您应用 1
单位的 Dense
层时,它会将最后一个维度减小到 1
,这意味着 (batch_size, 84, 64)
将在 Dense
之后变为 (batch_size, 84, 1)
层应用。您不应该使用 return_sequences=True
或使用另一个 layer/layers 将输出展平为 2 维,然后再将其馈送到 Dense
层。
我正在处理 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
将 return 具有形状 (batch_size, 84, 64)
的输出。这里的 84
由于您使用了 Conv1D
参数。因此,当您应用 1
单位的 Dense
层时,它会将最后一个维度减小到 1
,这意味着 (batch_size, 84, 64)
将在 Dense
之后变为 (batch_size, 84, 1)
层应用。您不应该使用 return_sequences=True
或使用另一个 layer/layers 将输出展平为 2 维,然后再将其馈送到 Dense
层。