LSTM-CNN开发中Conv1D层输入维度不匹配错误如何解决?
问题根因
Conv1D层要求输入为至少3维的张量,维度格式为(batch_size, 序列长度, 特征数),当前触发报错的原因是第二个LSTM层未开启return_sequences参数,输出维度只有2维(batch_size, 128),缺少了序列长度维度,不符合Conv1D的输入要求。
修复方案
有两种可行的修改思路,根据你的业务场景选择即可:
方案1:保留Conv1D在LSTM之后的结构,给第二个LSTM开启序列返回
只需要修改第二个LSTM层的参数,添加return_sequences=True即可,修改后的完整代码如下:
model = Sequential() model.add(LSTM(64, return_sequences = True, input_shape=(X_train.shape[1], X_train.shape[2]),activation='relu')) model.add(Dropout(0.1)) # 此处添加return_sequences=True,让LSTM输出3维张量 model.add(LSTM(128, activation= 'relu', return_sequences=True)) model.add(Conv1D(32, kernel_size=3, activation='relu')) model.add(Flatten()) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam')
注意:如果开启return_sequences后Conv1D报序列长度不足的错误,需要保证第二个LSTM输出的序列长度大于等于Conv1D的kernel_size(当前为3),如果你的时间步本身小于3,可以调小kernel_size的值。
方案2:调换CNN和LSTM的顺序,先做特征提取再做时序建模
如果你的业务逻辑更适合先对单时间步的特征做卷积提取,再输入LSTM做时序依赖学习,可以调整层的顺序:
model = Sequential() model.add(Conv1D(32, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2]))) model.add(Dropout(0.1)) model.add(LSTM(64, activation='relu')) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam')
这种方案无需使用Flatten层,参数更少,也能规避维度匹配问题,适合时序特征噪声较多的场景。
内容的提问来源于stack exchange,提问作者Ishita Chauhan
相关产品推荐
相关产品推荐

