如何导出LogisticRegressionCV模型并在Flutter中实现部署
解决方案
一、导出训练好的LogisticRegressionCV模型
scikit-learn训练的模型优先使用joblib做序列化导出,相比pickle对大数组类的模型序列化效率更高:
- 首先安装依赖(如果没装的话):
pip install joblib - 训练完成后直接导出模型文件:
import joblib # 假设你训练完成的模型变量名为lr_clf joblib.dump(lr_clf, "cat_dog_clf.joblib")
如果需要跨版本兼容,导出前可以先打印当前scikit-learn版本,后续模型转换环节使用相同版本即可避免不兼容问题:print(sklearn.__version__)
二、Flutter端集成流程
Flutter无法直接加载scikit-learn的原生模型文件,需要先做格式转换,推荐两种可落地的方案:
方案1:转换为ONNX格式推理(适配性高)
ONNX是通用的开放神经网络交换格式,移动端有成熟的推理支持:
- 首先把joblib/pkl格式的模型转为ONNX:
from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType # 这里的输入维度要和你训练时的输入维度完全一致,比如你把224*224*3的RGB图展平为150528维向量,就填对应数值 initial_type = [('input', FloatTensorType([None, 150528]))] onnx_model = convert_sklearn(lr_clf, initial_types=initial_type) # 保存ONNX模型 with open("cat_dog_clf.onnx", "wb") as f: f.write(onnx_model.SerializeToString())
- Flutter端集成:
在pubspec.yaml中引入ONNX运行时的Flutter封装库,把转换好的cat_dog_clf.onnx放到项目的assets目录下声明。推理时先对输入图片做和训练阶段完全一致的预处理:缩放到对应尺寸、像素归一化、展平为一维向量,再传入ONNX运行时得到输出结果,最后按阈值(默认0.5)判断分类结果即可。
方案2:手动导出参数轻量实现(包体积更小)
逻辑回归的推理逻辑非常简单,本质是 sigmoid(输入特征 × 权重 + 偏置),你可以直接导出模型参数手动实现推理,不需要引入额外的推理库:
- 导出模型参数:
import json # 导出权重和偏置 params = { "coef": lr_clf.coef_.tolist(), "intercept": lr_clf.intercept_.tolist(), "input_dim": lr_clf.n_features_in_ } with open("lr_params.json", "w") as f: json.dump(params, f)
- Flutter端把
lr_params.json放到assets目录加载,自己实现sigmoid函数和矩阵乘法逻辑,输入图片预处理完成后直接计算输出结果即可。
关键注意事项
- 移动端的图片预处理逻辑必须和训练阶段完全对齐,包括图片缩放尺寸、插值方式、像素归一化规则、通道顺序(RGB/BGR),否则会出现明显的准确率下降。
内容的提问来源于stack exchange,提问作者zeewa42
相关产品推荐
相关产品推荐

