DenseNet121二分类模型test_generator正常但预测总输出[0. 1.]怎么解决
修正预测代码基础语法错误
你当前贴出的预测代码存在多处基础问题:首先你导入的图像加载接口是load_img,代码中错误调用了不存在的load_image函数;其次缺少模型加载逻辑,也没有对加载的图像做维度适配、预处理操作。模型要求输入为(batch_size, 高, 宽, 通道数)的四维张量,你当前的输入维度完全不符合要求,会导致预测结果异常。补全和训练阶段完全一致的预处理逻辑
该问题是此类预测异常的最常见诱因:你训练阶段使用test_generator测试时,已经对图像做了尺寸调整、归一化/标准化处理,而你手写的预测代码没有做对应处理。使用Keras官方的DenseNet预训练权重时,训练阶段通常会调用from keras.applications.densenet import preprocess_input做预处理,预测阶段必须严格复用相同的逻辑,同时加载图像时的target_size必须和训练时定义的input_shape尺寸完全一致。验证预处理逻辑一致性
你可以从test_generator中取出一张已知分类结果的样本,将generator输出的张量和你自己手写代码处理后的同一张图像的张量做差值对比,如果差值不为0,说明预处理逻辑存在差异,需要对齐处理规则。确认模型加载和测试样本正确性
首先确认你加载的是训练完成、保存正确的权重文件,没有加载错初始权重或者未收敛的模型;其次更换另一张明确属于另一类别的样本做测试,排除当前测试样本本身分类结果就是[0. 1.]的可能性,同时确认训练时的标签编码和输出的类别对应关系匹配。
参考正确预测代码模板
import numpy as np from keras.preprocessing.image import load_img, img_to_array from keras.applications.densenet import preprocess_input from keras.models import load_model # 替换为你的训练好的模型路径 model = load_model("trained_densenet121.h5") # target_size替换为你训练时设置的输入尺寸,如224*224 img = load_img('C:/Users/yurtt/Desktop/orkun/a/b/dataset/test2/not/159.png', target_size=(224,224)) # 图像转数组 img_arr = img_to_array(img) # 扩展batch维度,适配模型输入要求 img_arr = np.expand_dims(img_arr, axis=0) # 和训练阶段完全一致的预处理,如果训练时用的是自定义归一化(如/255),替换为对应逻辑 processed_img = preprocess_input(img_arr) # 预测 result = model.predict(processed_img) print(result[0])
内容的提问来源于stack exchange,提问作者orkayu

