自定义TFLite疾病识别模型Python运行正常,Android Studio预测错误
问题1:输出概率最大值查找逻辑完全写反(核心错误)
你当前的输出后处理代码是在找最小的概率值,而不是模型推理需要的最大概率值:
// 错误代码:逻辑为筛选最小值 if(maxNum>outputArray[i]){ modelOutputIndex=i; maxNum=outputArray[i]; }
修正为如下逻辑即可:
// 正确代码:筛选最大概率对应的索引 if(outputArray[i] > maxNum){ modelOutputIndex = i; maxNum = outputArray[i]; }
这是你无论输入任何值都返回错误预测结果的最核心原因。
问题2:输入特征漏处理最后一个选中的症状
你当前提取选中症状的逻辑仅会处理到逗号位置,末尾没有逗号的最后一个症状会被完全忽略:比如用户输入发热,咳嗽,字符串末尾没有逗号,咳嗽这个症状不会被写入model_input数组,导致输入特征缺失。
修正方案:原有循环结束后额外处理最后一段内容:
// 原有遍历逗号的循环结束后补充以下代码 if (startIndex < itemsSelected.length()) { String s = itemsSelected.substring(startIndex).trim(); int currIndex = symptomList.indexOf(s); if (currIndex >= 0) { model_input[currIndex] = 1.0F; } }
问题3:输入张量形状不匹配
你训练的模型输入形状应该是[1, 132](batch size为1,特征数132),但你当前构造的inputBuffer没有匹配batch维度,部分版本的TFLite解释器会因为形状不匹配出现推理异常。
修正方案:使用TensorBuffer封装输入更稳妥,替换原有inputBuffer构造逻辑即可:
TensorBuffer inputBuffer = TensorBuffer.createFixedSize(new int[]{1, 132}, DataType.FLOAT32); inputBuffer.loadArray(model_input); interpreter.run(inputBuffer.getBuffer(), outputBuffer.getBuffer());
问题4:重复加载模型的异常风险
你每次点击按钮都会重新加载TFLite模型,不仅性能极低,如果加载失败还会触发空指针异常。建议把Interpreter的初始化放到onCreate方法中全局初始化一次即可。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

