ResNet50模型预测胸片新冠肺炎时始终输出类别1,求故障排查方案
问题原因分析
- 预测逻辑的致命错误:你使用
sigmoid作为输出层激活函数,输出值的范围固定在(0,1)区间,但你后续的二分类阈值判断写为np.where(predictions < 0, 0, 1),永远不可能触发小于0的判断条件,所有预测结果都会被强制转为1,这是你看到全输出1的最直接原因。正确的阈值判断应该以0.5为分界:predictions = np.where(predictions < 0.5, 0, 1)。 - 模型结构堆叠错误:你初始化
ResNet50时指定了classes=2,此时ResNet50会默认包含顶层的2分类输出全连接层,你后续又额外叠加了Flatten、全连接层、1神经元的sigmoid输出层,整个模型结构完全不符合设计预期。正确的做法是初始化ResNet50时添加include_top=False参数,去掉模型自带的分类头,再接入你自定义的分类层。 - 随机初始化权重时错误冻结层参数:你设置了
weights=None,即ResNet50的所有参数都是随机初始化的,此时你将前-8层全部冻结不参与训练,相当于90%以上的模型参数都是随机无效值且不会更新,模型根本无法学习到有效特征,自然没有分类能力。冻结层操作仅在使用预训练权重做迁移学习时才有意义,随机初始化的模型不能冻结任何层。 - 缺少必要的输入预处理:ResNet50默认要求输入图像做对应归一化处理,你当前直接读取0-255范围的原始像素值输入模型,数值范围不匹配会导致模型收敛难度大幅提升。建议添加
tf.keras.applications.resnet50.preprocess_input对输入图像做预处理。 - 冗余代码问题:你写的遍历数据集生成train_X、test_X的代码完全没有被后续训练、预测流程使用,属于无效代码,可以直接删除。
- 数据集分布验证:可以先统计训练集和验证集中类别0和类别1的样本占比,确认是否存在极端类别不平衡的情况,同时确认
image_dataset_from_directory自动生成的标签是否和你的预期一致(该工具默认按文件夹名称字典序分配0、1标签)。
内容的提问来源于stack exchange,提问作者Gnomes
相关产品推荐
相关产品推荐

