You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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执行推理时,无论上传任何输入图像,输出的分类概率始终固定,不会随输入图像变化更新。

排查修复方案
  1. 修正函数调用拼写错误
    定义的模型加载函数名为loadIDCModel(),推理环节错误调用了不存在的loadMetModel(),属于基础语法错误,优先修正该调用为正确函数名。
  2. 对齐训练阶段的预处理逻辑
    模型训练时通常会将0-255范围的图像像素值做归一化(如除以255映射到0-1区间、或按数据集均值方差做标准化),当前代码仅做了尺寸调整和数组转换,缺少和训练阶段完全一致的预处理步骤,会导致输入数据分布和训练时严重不匹配,输出无意义的固定值。如果训练时用的是除以255归一化,在数组转换后补充代码:
    input_arr = input_arr / 255.0
    
  3. 移除冗余Softmax层
    如果训练导出的.h5模型最后一层已经自带Softmax激活,外层额外拼接Softmax层会对已经是0-1区间的概率值重复做Softmax计算,最终输出会被压缩到接近固定值。可先直接调用原模型预测,若输出已经是0-1区间的概率值,直接删除外层拼接tf.keras.layers.Softmax()的逻辑即可。
  4. 替换Streamlit缓存装饰器
    旧版本@st.cache装饰器缓存TensorFlow模型时容易出现权重状态锁定问题,替换为Streamlit官方针对模型等全局资源推荐的@st.cache_resource装饰器即可避免该类缓存异常。
  5. 校验输入张量维度
    推理前打印input_arr.shape,确认输入维度为模型要求的(1, 96, 96, 3)四维格式,避免维度错位导致模型读取到无效固定值。

内容的提问来源于stack exchange,提问作者FelipeAllStack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:33:39