CNN猫狗二分类模型预测得分均高于0.5无法识别猫类问题排查
问题根因分析
你的问题核心是训练流程和模型结构的错误配置导致的,数据集规模偏小是次要影响因素,并非当前故障的核心原因。
所有得分集中在0.5~0.6、无低于0.5得分的直接原因
你在模型定义中错误地在InceptionV3输出和Sigmoid层之间添加了ReLU层:
# 错误写法 return self.sigmoid(self.dropout(self.relu(features))).squeeze(1)
InceptionV3最后一层全连接的输出本身可正可负,ReLU层会将所有小于0的输出强制截断为0,而sigmoid(0) = 0.5,因此所有对应猫类(预期输出<0.5)的负输入都会被强制转为0,输出得分最低只能到0.5,不可能出现低于0.5的结果。
模型完全不收敛的其他配置错误
- 超参数设置不合理:你冻结了整个InceptionV3的预训练权重(
train_CNN=False),仅训练最后一层全连接层,但学习率仅设置为1e-5,同时训练轮次只有10轮,权重更新量极小,基本停留在随机初始化的状态,输出自然接近0.5。从训练日志也能看出,验证集准确率全程固定在39.02,没有任何提升,证明模型完全没有学到有效特征。 - 训练逻辑冗余低效:你在每个batch训练结束后都执行全量验证集的准确率计算,不仅大幅拖慢训练速度,也对模型训练没有任何增益。
- 数据集的次要影响:200张样本的规模确实偏小,会限制模型最终的泛化能力,但并不是模型完全不收敛的核心原因,哪怕是小样本,配置正确的前提下也能在训练集上达到远高于随机猜测的准确率。
修复方案
- 删掉模型前向传播中的ReLU层,修改为:
return self.sigmoid(self.dropout(features)).squeeze(1) - 将仅训练全连接层的学习率调整到1e-3 ~ 1e-4区间,训练轮次提升到30~50轮,保证全连接层有足够的更新量。
- 若算力充足,可将
train_CNN改为True,解冻部分或全部 backbone 层做微调,能大幅提升模型效果。 - 将验证集准确率的计算逻辑移动到每个epoch结束后执行,不要每个batch都重复计算。
内容的提问来源于stack exchange,提问作者user164863
相关产品推荐
相关产品推荐

