如何使用scikit-learn训练线性回归模型,导出onnx模型,并在C#中通过onnxruntime使用sklearn的模型?

什么是onnx格式?

ONNX(Open Neural Network Exchange)格式是一种开放的深度学习模型格式,它允许不同的深度学习框架之间进行模型转换和共享。ONNX格式使用XML作为文件格式,并定义了一种标准的数据结构来表示神经网络中的每个层、每个参数以及整个模型。

使用ONNX格式的好处包括:

  1. 模型互操作性:ONNX格式允许不同的深度学习框架之间进行模型转换和共享,例如将TensorFlow模型转换为Caffe模型,或将PyTorch模型转换为MXNet模型等。

  2. 跨平台支持:ONNX格式可以在不同的操作系统和硬件平台上运行,例如Windows、Linux、macOS、iOS、Android等。

  3. 易于部署:ONNX格式可以轻松地部署到不同的环境中,例如边缘设备、服务器、云平台等。

  4. 开放标准:ONNX格式是一个开放的标准,由Facebook、Microsoft、NVIDIA、Apache等组织共同开发和维护,具有广泛的应用前景。

https://onnx.ai/

什么是scikit-learn?

Scikit-Learn是一个用于Python编程语言的机器学习库。它提供了各种监督和无监督学习算法,包括分类、回归、聚类、降维等。Scikit-Learn易于使用,具有丰富的文档和示例,并且可以在各种平台上运行。它是机器学习领域中最常用的Python库之一。

User guide: contents — scikit-learn 1.3.2 documentation

使用scikit-learn训练线性回归模型,并把模型导出为onnx

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from skl2onnx import to_onnx
 
# 创建数据集
np.random.seed(0)
x = np.random.rand(100, 1)
x = x.astype(np.float32)
y = 2 + 3 * x + np.random.rand(100, 1)
y = y.astype(np.float32)
 
# 将数据集分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
 
# 训练模型
model = LinearRegression()
model.fit(x_train, y_train)
 
# 保存模型到文件
onx = to_onnx(model, x[:1])
with open("linear_regression_model.onnx", "wb") as f:
    f.write(onx.SerializeToString())

更多可以参考:

[Python] 如何把scikit-learn的线性回归模型导出为onnx格式,并使用onnx模型文件进行预测-CSDN博客

查看onnx模型属性

Netron

Netron是一个开源的ONNX Runtime浏览器,它允许用户在本地计算机上查看ONNX模型。

使用Netron打开对应的onnx文件,查看输入和输出的维度,如下图所示(在本例子中,输入必须是Nx1维的浮点数,输出也是Nx1维的浮点数):

C#使用onnx模型进行推理(预测)

右键点击你的C#项目,选择“管理NuGet程序包”,安装Onnxruntime库(Microsoft.ML.OnnxRuntime和Microsoft.ML.OnnxRuntime.Managed):

C# | onnxruntime

Basic C# Tutorial | onnxruntime

调用onnx模型进行推理(预测): 

using Microsoft.ML.OnnxRuntime;
namespace ScikitLearn{

    public class ModelRunner
    {
        public static void Main()
        {
            string modelFilePath = @"D:/my_notebooks/机器学习/scikit-learn/linear_regression_model.onnx";

            SessionOptions options = new SessionOptions();
            options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
            InferenceSession _onnxSession = new InferenceSession(modelFilePath, options);

            var inputName = _onnxSession.InputNames[0];

            // 输入4*1维的数值
            using var inputOrtValue = OrtValue.CreateTensorValueFromMemory(new float[] { 1, 2, 3, 4 }, new long[] { 4, 1 });

            var inputs = new Dictionary<string, OrtValue>
            {
                { inputName, inputOrtValue }
            };

            using var runOptions = new RunOptions();
            using (var outputs = _onnxSession.Run(runOptions, inputs, _onnxSession.OutputNames))
            {
                // 输出4*1维的预测值
                var outputFirst = outputs.First();
                var outputDatas = outputFirst.GetTensorDataAsSpan<float>();
                foreach (var output in outputDatas)
                {
                    Console.WriteLine(output);
                }
            }
        }
    }
}

输出结果如下所示: 

输出结果与模型的线性回归方程“y = 2 + 3 * x + np.random.rand(100, 1)”相吻合。

参考资料

GitHub - gnovack/sklearn-dotnet
https://s3-eu-west-1.amazonaws.com/pfigshare-u-files/5976036/cal_housing.tgz 
Latest supported Visual C++ Redistributable downloads | Microsoft Learn
sklearn-onnx 1.16.0 documentation
Open Neural Network Exchange · GitHub
GitHub - onnx/sklearn-onnx: Convert scikit-learn models and pipelines to ONNXGitHub - microsoft/onnxruntime: ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值