CNN+LSTM多文本分类模型构建报错:输入形状不兼容问题求助
CNN+LSTM文本分类模型输入形状不匹配问题解决
我构建了一个融合CNN与LSTM的多类别文本分类模型,由CNN提取TF-IDF特征后传入LSTM,但运行代码时出现输入形状不兼容的错误。
模型代码
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Dropout,Flatten,Activation from tensorflow.keras.metrics import CategoricalAccuracy, AUC from tensorflow import keras import tensorflow as tf from keras.layers import TimeDistributed from tensorflow.keras.layers import Conv2D,MaxPooling2D,Conv1D,MaxPooling1D from keras.layers.recurrent import LSTM model = Sequential() model.add(Conv1D(128, 5, activation='relu', input_shape=(1500,1))) model.add(MaxPooling1D(pool_size=2)) model.add(LSTM(10)) model.add(Dense(5, activation='softmax')) model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) history=model.fit(X_train, y_train, epochs=20,validation_data=(X_test,y_test),batch_size=512)
报错信息
ValueError: Input 0 of layer sequential_33 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape (None, 1, 1500)
问题分析与解决
- 问题根源:
Conv1D层定义的输入形状是(1500,1),即每个样本需要是1500个时间步,每个时间步对应1个特征;但实际输入数据的形状是(None,1,1500),也就是1个时间步、1500个特征,维度顺序完全不匹配,导致报错。 - 修正方案:
- 调整输入数据形状(推荐):把特征维度放到最后一维,让数据符合模型的输入要求。可以用NumPy或TensorFlow的方法实现:
# 若X_train是NumPy数组 X_train = X_train.reshape(-1, 1500, 1) X_test = X_test.reshape(-1, 1500, 1) # 若用TensorFlow张量 X_train = tf.expand_dims(X_train, axis=-1) X_test = tf.expand_dims(X_test, axis=-1) - 修改模型输入形状(不推荐):如果不想调整数据,可以把
Conv1D的input_shape改为(1,1500),但这种方式下CNN是对单步的1500个特征做卷积,不符合文本分类中用CNN处理序列特征的常规逻辑,可能影响模型效果。
- 调整输入数据形状(推荐):把特征维度放到最后一维,让数据符合模型的输入要求。可以用NumPy或TensorFlow的方法实现:
内容的提问来源于stack exchange,提问作者user1873093
相关产品推荐
相关产品推荐

