什么是onnx格式?
ONNX(Open Neural Network Exchange)格式是一种开放的深度学习模型格式,它允许不同的深度学习框架之间进行模型转换和共享。ONNX格式使用XML作为文件格式,并定义了一种标准的数据结构来表示神经网络中的每个层、每个参数以及整个模型。
使用ONNX格式的好处包括:
-
模型互操作性:ONNX格式允许不同的深度学习框架之间进行模型转换和共享,例如将TensorFlow模型转换为Caffe模型,或将PyTorch模型转换为MXNet模型等。
-
跨平台支持:ONNX格式可以在不同的操作系统和硬件平台上运行,例如Windows、Linux、macOS、iOS、Android等。
-
易于部署:ONNX格式可以轻松地部署到不同的环境中,例如边缘设备、服务器、云平台等。
-
开放标准:ONNX格式是一个开放的标准,由Facebook、Microsoft、NVIDIA、Apache等组织共同开发和维护,具有广泛的应用前景。
什么是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是一个开源的ONNX Runtime浏览器,它允许用户在本地计算机上查看ONNX模型。
使用Netron打开对应的onnx文件,查看输入和输出的维度,如下图所示(在本例子中,输入必须是Nx1维的浮点数,输出也是Nx1维的浮点数):
C#使用onnx模型进行推理(预测)
右键点击你的C#项目,选择“管理NuGet程序包”,安装Onnxruntime库(Microsoft.ML.OnnxRuntime和Microsoft.ML.OnnxRuntime.Managed):
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