Streamlit+TensorFlow加载h5模型图像二分类预测结果无变化问题
问题描述
- 基于TensorFlow框架实现二分类图像分析功能,调用训练完成的
.h5格式模型对输入图像做正负类判断,返回对应分类概率,需求相关学习参考资料。 - 已部署应用地址:IDC检测在线应用
现有代码
依赖引入
import numpy as np import streamlit as st import tensorflow as tf from keras.models import load_model
模型加载逻辑
@st.cache(allow_output_mutation=True) def loadIDCModel(): model_idc = load_model('models/IDC_model.h5', compile=False) model_idc.summary() return model_idc
推理业务逻辑
if uploaded_file is not None: # 转换图像为numpy数组 file_bytes = tf.keras.preprocessing.image.load_img(uploaded_file, target_size=(96,96), grayscale = False, interpolation = 'nearest', color_mode = 'rgb', keep_aspect_ratio = False) c.image(file_bytes, channels="RGB") Genrate_pred = st.button("Generate Prediction") if Genrate_pred: model = loadMetModel() input_arr = tf.keras.preprocessing.image.img_to_array(file_bytes) input_arr = np.array([input_arr]) probability_model = tf.keras.Sequential([model, tf.keras.layers.Softmax()]) prediction = probability_model.predict(input_arr) dict_pred = {0: 'Benigno/Normal', 1: 'Maligno'} result = dict_pred[np.argmax(prediction)] value = 0 if result == 'Benigno/Normal': value = str(((prediction[0][0])*100).round(2)) + '%' else: value = str(((prediction[0][1])*100).round(2)) + '%' c.metric('Predição', result, delta=value, delta_color='normal')
故障现象
调用model.predict执行推理时,无论上传任何输入图像,输出的分类概率始终固定,不会随输入图像变化更新。
排查修复方案
- 修正函数调用拼写错误
定义的模型加载函数名为loadIDCModel(),推理环节错误调用了不存在的loadMetModel(),属于基础语法错误,优先修正该调用为正确函数名。 - 对齐训练阶段的预处理逻辑
模型训练时通常会将0-255范围的图像像素值做归一化(如除以255映射到0-1区间、或按数据集均值方差做标准化),当前代码仅做了尺寸调整和数组转换,缺少和训练阶段完全一致的预处理步骤,会导致输入数据分布和训练时严重不匹配,输出无意义的固定值。如果训练时用的是除以255归一化,在数组转换后补充代码:input_arr = input_arr / 255.0 - 移除冗余Softmax层
如果训练导出的.h5模型最后一层已经自带Softmax激活,外层额外拼接Softmax层会对已经是0-1区间的概率值重复做Softmax计算,最终输出会被压缩到接近固定值。可先直接调用原模型预测,若输出已经是0-1区间的概率值,直接删除外层拼接tf.keras.layers.Softmax()的逻辑即可。 - 替换Streamlit缓存装饰器
旧版本@st.cache装饰器缓存TensorFlow模型时容易出现权重状态锁定问题,替换为Streamlit官方针对模型等全局资源推荐的@st.cache_resource装饰器即可避免该类缓存异常。 - 校验输入张量维度
推理前打印input_arr.shape,确认输入维度为模型要求的(1, 96, 96, 3)四维格式,避免维度错位导致模型读取到无效固定值。
内容的提问来源于stack exchange,提问作者FelipeAllStack
相关产品推荐
相关产品推荐

