Keras多分类模型测试精度远低于训练精度的调优求助
多分类模型过拟合问题调优方案
问题背景
训练阶段精度达到100%,但测试精度仅14.26%,存在严重过拟合,即使添加Dropout层也未改善。
模型代码
n_labels = len(unique(X_train_enc)) in_layer = Input(shape=(1,)) em_layer = Embedding(input_dim = int(n_labels)+1,output_dim = 7, input_length = 1, name="embedding")(in_layer) dense = Dense(512, activation='relu', kernel_initializer='he_normal')(em_layer) dense = Dropout(0.2)(dense) output = Dense(7, activation='softmax')(dense) model = Model(inputs=in_layer, outputs=output) model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(X_train_enc, y_train_enc, epochs=100, batch_size=100, verbose=1)
训练与测试结果
训练日志片段
Epoch 98/100
572/572 [================] - 11s 19ms/step - loss: 3.7565e-11 - accuracy: 1.0000
Epoch 99/100
313/572 [=>..............] - ETA: 5s - loss: 2.2852e-11 - accuracy: 1.0000
测试结果
测试代码:
test_loss, test_acc = model.evaluate(X_test_enc, y_test_enc,verbose=1) print('Test Accuracy: ', test_acc, '\nTest Loss: ', test_loss) print('Accuracy: %.2f' % (test_acc*100))
输出:
766/766 [==============================] - 7s 9ms/step - loss: 20.4420 - accuracy: 0.1426
Test Accuracy: 0.1426003873348236
Test Loss: 20.441951751708984
Accuracy: 14.26
调优建议
- 控制模型复杂度:当前Embedding层后直接连接512维Dense层,参数冗余导致过拟合。建议降低Dense层维度至64或128,缩小模型容量,避免对训练数据过度拟合。
- 增强正则化强度:现有0.2的Dropout率正则化力度不足,可提升至0.3-0.5;同时给Dense层添加L2正则项,例如在Dense层中加入
kernel_regularizer=l2(0.01),限制权重规模。 - 提前停止训练:训练100轮已出现严重过拟合,使用EarlyStopping回调函数监测验证集性能,当验证集指标不再提升时自动终止训练,保留最优权重。示例代码:
from tensorflow.keras.callbacks import EarlyStopping early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True) model.fit(X_train_enc, y_train_enc, epochs=100, batch_size=100, validation_split=0.1, callbacks=[early_stop], verbose=1) - 加入验证集监控:训练过程中引入验证集(通过
validation_split或单独传入验证数据),实时对比训练集与验证集的精度、损失变化,及时发现过拟合迹象。 - 调整Embedding层参数:Embedding的output_dim设为7与输出类别数一致,特征表达能力不足。可尝试增大至16或32,若输入标签数量庞大,也可给Embedding层添加正则项。
- 检查数据合理性:确认训练集与测试集的类别分布是否一致,排查是否存在类别不平衡、数据泄露问题。若测试集分布与训练集差异过大,或训练混入测试数据,都会导致测试精度异常。
- 优化学习策略:Adam默认学习率可能偏大,导致训练后期震荡或过拟合。可降低学习率至1e-4,或使用ReduceLROnPlateau回调函数实现学习率衰减。
内容的提问来源于stack exchange,提问作者Anantha
相关产品推荐
相关产品推荐

