TensorFlow从零训练Xception图像分类模型损失与准确率无提升求助
类别缩减对性能的影响
仅选取ImageNet的500类训练不会导致性能大幅低于原论文结果,只要每类训练样本量与原论文对齐(每类约1000张训练样本),更少的分类类别反而会降低任务难度,不是性能不达标的核心原因。
核心问题与修复方案
- 数据生成器逻辑错误
你当前的image_gen每次仅返回单张样本,model.fit中设置的batch_size=32完全不生效,相当于实际训练的batch size为1。小batch会导致梯度震荡极其严重,是模型无法收敛的核心原因。同时你没有添加任何训练数据增强策略,仅做了resize操作,和原论文使用的随机裁剪、水平翻转、颜色扰动的训练预处理逻辑不符,很容易出现过拟合。
修复方案:- 改写生成器,每次按batch size返回批量的X和y,不要逐张yield样本
- 新增训练阶段数据增强:训练时先将图片resize到256×256,再随机裁剪出224×224区域,增加随机水平翻转、轻微颜色扰动
- 模型调用参数错误
你调用Xception时强制传入了training=True参数,会导致BatchNormalization层在训练和验证阶段都始终使用当前batch的均值和方差,不会使用训练阶段累计的滑动均值方差做验证推理,直接导致验证结果失真、模型泛化能力极差。
修复方案:删除training=True参数,Keras会自动在训练/推理状态下切换BN层的运行逻辑 - 训练步数配置错误
当前设置的steps_per_epoch=64意味着每个epoch仅训练64*32=2048张样本,500类场景下平均每类仅能见到4张样本,模型完全无法学习到足够的特征。原论文训练时每个epoch会跑完全量128万张ImageNet训练样本,你的步数设置仅用到了极少量的训练数据。
修复方案:将steps_per_epoch设置为训练集总样本数 / batch_size,validation_steps设置为验证集总样本数 / batch_size - 学习率适配问题
原论文给出的初始学习率0.045是适配batch size 256的配置,如果你使用batch size 32训练,需要等比例下调初始学习率到0.01左右,避免初始梯度过大导致模型训崩。
快速验证方法
修改完成后先做小范围测试校验逻辑:
- 抽取10类各100张样本构成小数据集,训练后确认模型可以在该小数据集上拟合到接近100%的训练准确率,排除代码逻辑问题
- 再切换到全量500类数据集训练,监控训练/验证损失和准确率曲线,确认指标呈现正常的下降/上升趋势
内容的提问来源于stack exchange,提问作者Grand Koala
相关产品推荐
相关产品推荐

