模型转TFLite量化后仅识别0类,1类无法分类的问题求助
问题分析与解决方案
核心错误:二分类输出的预测逻辑错误
你的模型最后一层是Dense(1, activation='sigmoid'),属于二分类单输出结构,输出值范围是[0,1],代表样本属于类别1的概率。但你在TFLite推理时错误使用了np.argmax():
prediction_classes = np.argmax(tflite_model_predictions, axis=1)
由于输出张量形状为(74485, 1),每个样本仅对应1个输出值,argmax在axis=1维度上只能返回0,导致所有样本都被判定为类别0,这就是1类完全无法识别的直接原因。
修正后的预测代码
将预测逻辑改为基于阈值的二分类判断(通常取0.5作为分界):
# 替换原有的prediction_classes计算逻辑 prediction_classes = (tflite_model_predictions > 0.5).astype(int).flatten()
>0.5:将概率大于0.5的样本判定为类别1astype(int):将布尔结果转为0/1整数标签flatten():将形状从(74485,1)转为(74485,),与y_test的形状匹配
额外验证与优化建议
- 量化模型一致性检查:
确保加载的tflite_qaware_model.tflite是通过converter.optimizations = [tf.lite.Optimize.DEFAULT]生成的量化模型,且保存路径正确。 - 批量推理内存优化:
一次性将输入张量resize到74485样本可能占用较多内存,建议改用批量推理:interpreter = tf.lite.Interpreter(model_path="tflite_qaware_model.tflite") interpreter.allocate_tensors() input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() batch_size = 32 prediction_classes = [] for i in range(0, len(X_test_numpy), batch_size): batch = X_test_numpy[i:i+batch_size] interpreter.set_tensor(input_details[0]['index'], batch) interpreter.invoke() batch_preds = interpreter.get_tensor(output_details[0]['index']) prediction_classes.extend((batch_preds > 0.5).astype(int).flatten()) prediction_classes = np.array(prediction_classes) - 输入数据匹配验证:
确保X_test_numpy的预处理逻辑和训练时完全一致,比如是否做了归一化/标准化操作(若训练阶段执行过)。
修正结果验证
修正后重新生成混淆矩阵和分类报告,结果应与原模型的准确率(99%+)接近,可正常识别类别1。
内容的提问来源于stack exchange,提问作者Frenzy
相关产品推荐
相关产品推荐

