Keras搭建CapsNet图像分类模型训练准确率高验证准确率低问题
问题成因分析
- 验证集划分逻辑错误:你已提前将全量数据集按8:2划分为训练集和测试集,但代码中
model.fit配置了validation_split=0.2,会从原训练集再切20%作为训练时的验证集。如果未提前对全量数据集做全局打乱,这个子验证集的样本分布可能和训练集、测试集存在明显偏移,导致验证准确率异常偏低,你当前看到的29%准确率就是这个子验证集的结果。 - 严重过拟合:训练准确率达96%、验证准确率不足30%属于典型的过拟合表现。CapsNet本身参数量较大,你当前代码未加入任何正则化手段,也没有做训练数据增强,模型很容易直接记住训练集的特征,无法泛化到未见过的样本。
- 训练配置不合理:
- 早停策略
patience=2设置过小,模型仅训练3轮还未充分收敛就被提前终止,没有足够的迭代空间调整参数 - 早停监控的是包含重构损失的总
val_loss,和分类任务的核心目标val_capsnet_accuracy不完全对齐,可能出现分类准确率还在提升但总损失上升就被提前停止的情况 - 若重构损失权重
lam_recon设置过大,会导致重构任务主导优化方向,分类任务的优化目标被稀释 - 若初始学习率设置过高,会导致参数更新幅度过大,验证集表现快速震荡下降
- 早停策略
- 预处理逻辑不一致:如果训练集和测试集的图像归一化、尺寸调整、通道顺序等预处理逻辑不统一,也会导致跨集表现差距极大。
可行解决方案
- 修正验证集逻辑:
- 先对全量数据集做随机打乱,再按8:2划分训练集和测试集,保证两类数据集的样本分布一致
- 训练时要么提前从训练集切分固定的验证子集,要么将
model.fit的validation_data参数设置为([x_test, y_test], [y_test, x_test]),取消validation_split配置,确保验证集的分布一致性
- 增加正则化与数据增强:
- 在CapsNet的特征提取层后加入
Dropout(0.2~0.5)层,或者给全连接层增加L2正则项,抑制过拟合 - 训练阶段加入随机裁剪、随机水平/垂直翻转、亮度/对比度调整等数据增强操作,提升训练样本的特征多样性
- 在CapsNet的特征提取层后加入
- 调整训练配置:
- 将早停的
patience调整为5~10,给模型足够的收敛空间,同时可以将早停监控指标改为val_capsnet_accuracy,更贴合分类任务的核心目标 - 调整
lam_recon权重,常规3分类任务建议设置为0.0005~0.001,避免重构损失占用过多优化权重 - 降低初始学习率到1e-4~3e-4,避免参数更新过快跳过最优解
- 将早停的
- 对齐预处理逻辑:确保训练集、验证集、测试集的图像尺寸、归一化范围、通道顺序等所有预处理逻辑完全一致,避免人为引入分布差异。
内容的提问来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

