CNN-LSTM模型训练报错:输入形状不兼容问题求助
解决CNN-LSTM输入形状不兼容问题
问题根源
你的输入数据shape为(9219, 7, 7, 12),但模型第一层Conv1D期望的输入格式是(None, 7, 84):
None:自动匹配的样本数量7:序列长度84:每个序列步的特征数(即7*12,对应原始数据中每个序列步的7x12图像展平后的维度)
解决方案
1. 重塑输入数据格式
将每个序列步的二维图像展平为一维特征向量,代码如下:
# 重塑训练集 train_x = train_x.reshape(train_x.shape[0], train_x.shape[1], train_x.shape[2] * train_x.shape[3]) # 如果有验证集,同样处理 # val_x = val_x.reshape(val_x.shape[0], val_x.shape[1], val_x.shape[2] * val_x.shape[3])
处理后train_x的shape变为(9219, 7, 84),与模型期望的输入格式匹配。
2. 修正model.fit参数错误
你的代码中误写为model.fit(train_x.shape[1], train_y, epochs=20),需要改为传入训练数据train_x:
model.fit(train_x, train_y, epochs=20)
完整修正后的代码
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv1D, LSTM, MaxPooling1D, Dense from tensorflow.keras.optimizers import Adam # 重塑输入数据 train_x = train_x.reshape(train_x.shape[0], train_x.shape[1], train_x.shape[2] * train_x.shape[3]) # 构建模型 model = Sequential() model.add(Conv1D(32, 4, activation='relu', padding='same', input_shape=(train_x.shape[1], train_x.shape[2]))) model.add(LSTM(32, return_sequences=True)) model.add(MaxPooling1D(2)) model.add(Conv1D(16, 8, activation="relu", padding='same')) model.add(LSTM(64, return_sequences=True)) model.add(MaxPooling1D(2)) model.add(Conv1D(16, 8, activation="relu", padding='same')) model.add(LSTM(128)) model.add(Dense(3, activation='sigmoid')) # 编译模型 model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy']) print(model.summary()) # 训练模型 model.fit(train_x, train_y, epochs=20)
补充说明
Conv1D层专门用于处理序列数据,要求输入格式为**(样本数, 序列长度, 特征维度)**。如果你想保留图像的空间结构,可以考虑先用Conv2D提取图像特征,再将特征传入LSTM层,这种架构也适合图像序列任务。
内容的提问来源于stack exchange,提问作者Hadi Emami
相关产品推荐
相关产品推荐

