CNN-LSTM模型始终预测同一类别问题求助
问题描述
我尝试对图像序列进行预测,此前仅用CNN处理拼接后的图像,但在部分数据集上效果不佳。我使用两类数据集:一类用于单张图像分类,另一类用于图像序列分类,通过total_x_test_indexes=tf.expand_dims(total_x_test_indexes, axis=1)实现模型通用。搭建CNN-LSTM模型后,输出的混淆矩阵显示几乎所有样本都被归为同一类别,附上实现代码及混淆矩阵截图,寻求解决办法。
实现代码
inp = Input((None,size_image,size_image,1), ragged=True) x = TimeDistributed(cnn)(inp) x = LSTM(25)(x) size_predictions=len(dicTiposNumbers) print("tamaño ",size_predictions) out = Dense(size_predictions)(x) model = Model(inp, out) print(model.summary()) opt = keras.optimizers.Adam(learning_rate=0.05) opt = keras.optimizers.SGD(learning_rate=0.15) # Compile the model model.compile(optimizer=opt, loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['accuracy']) print('------------------------------------------------------------------------') print(f'Training for fold {fold_no} ...') total_x_train_indexes=tf.gather(total_x,indices=train) total_y_train_indexes=tf.gather(total_y,indices=train) total_x_train_indexes=tf.expand_dims(total_x_train_indexes, axis=1) print("shape after gather",np.shape(total_x_train_indexes[0])) history = model.fit(total_x_train_indexes, total_y_train_indexes, batch_size=512, epochs=5)
混淆矩阵现象

解决建议
- 排查数据集类别平衡:先统计训练集各类样本数量,若存在严重类别不平衡(某类样本占比极高),模型会自然偏向多数类。解决方式包括:对少数类过采样、多数类欠采样,或在
model.fit中设置class_weight参数赋予少数类更高权重。 - 修正损失函数配置:输出层
Dense(size_predictions)未添加激活函数,输出为logits,但编译时设置from_logits=False,会导致损失计算错误。需将from_logits改为True,或给Dense层添加activation='softmax'。 - 调整优化器与学习率:当前先定义Adam后覆盖为SGD,且SGD学习率0.15过高,易导致模型训练震荡无法收敛。建议改用Adam优化器,初始学习率设为0.001,后续根据训练曲线微调。
- 增加训练轮数:仅训练5轮不足以让模型学习到有效特征,建议将epochs调至20-50,同时添加
EarlyStopping回调函数,监控验证集准确率或损失,防止过拟合。 - 检查CNN输出维度:确保TimeDistributed包装的CNN最后使用全局池化层(如
GlobalAveragePooling2D),将单张图像的特征压缩为一维向量,否则LSTM无法有效处理高维序列特征。 - 验证输入数据格式:确认
total_x_train_indexes的shape与模型输入匹配,RaggedTensor的处理逻辑正确。可打印输入的具体维度,确保序列长度、图像尺寸等参数符合要求。
内容的提问来源于stack exchange,提问作者Wilber C
相关产品推荐
相关产品推荐

