基于ResNet50+BiLSTM的手写句子识别模型损失过高且准确率持续为0的问题排查求助
基于ResNet50+BiLSTM的手写句子识别模型损失过高且准确率持续为0的问题排查求助
我最近在做手写句子识别的任务,用的是ResNet50搭配BiLSTM的组合架构。我的数据集是手写句子的图片,每个句子对应一个图片序列;每个句子有10个样本,都存在单独的文件夹里,标签则存在CSV文件中,包含句子ID和对应的文本标签。我用TensorFlow框架实现,但训练时遇到了很棘手的问题:
- 损失函数初始值是9.1130,之后一直居高不下,没有明显下降趋势
- 已经训练了20个epoch,准确率始终是0.0000e+00,完全没有提升
我的数据集路径定义和自定义数据生成器代码如下:
# Dataset paths dataset_path = "/content/drive/My Drive/Images" csv_path = "/content/drive/My Drive/Labels/lines-labels.csv" # Data Generator: # 我实现了一个自定义数据生成器来加载图片序列和对应的标签: class DataGenerator(Sequence): def __init__(self, dataset_path, labels_df, batch_size, seq_length, img_width, img_height): # 初始化参数... def __len__(self): # 返回批次数... def __getitem__(self, index): # 加载一批序列数据...
模型方面,我用ResNet50做特征提取,双向LSTM处理序列建模,代码如下:
def build_resnet_bilstm_model(input_shape, num_classes): resnet_base = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) for layer in resnet_base.layers: layer.trainable = False input_layer = Input(shape=input_shape) time_distributed = TimeDistributed(resnet_base)(input_layer) time_distributed = TimeDistributed(Flatten())(time_distributed) bilstm = Bidirectional(LSTM(256, return_sequences=False))(time_distributed) dropout = Dropout(0.5)(bilstm) output_layer = Dense(num_classes, activation='softmax')(dropout) model = Model(inputs=input_layer, outputs=output_layer) model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy']) return model
训练参数设置:
- 训练轮次:20
- 早停机制patience:5
- 最小学习率:1e-6
我现在怀疑问题可能出在以下几个方向,想请教各位大佬:
- 图片或者标签的预处理是不是存在错误?
- 数据生成器的实现,或者序列长度(SEQ_LENGTH = 10)的设置有没有问题?
- 模型架构本身,尤其是ResNet50和BiLSTM的整合部分是否存在不合理的地方?
希望大家能给我一些建议或者排查思路,帮我改善模型的训练表现。
备注:内容来源于stack exchange,提问作者Hevi Khosrawi
相关产品推荐
相关产品推荐

