在 ML.Net 1.4 中使用 ONNX 模型进行推理时出错
Error while using ONNX model for inferencing in ML.Net 1.4
我正在 ML.Net 创建我的第一个应用程序。
我想使用 sklearn
构建的模型来预测给定制造年份的汽车价格。
为此,我使用了如下所示的简单数据集。
> id region price year model fuel odometer transmission
> 7316814884 auburn 33590 2014 sierra 1500 crew cab slt gas 57923 other
> 7316814758 auburn 22590 2010 silverado 1500 gas 71229 other
> 7316814989 auburn 39590 2020 silverado 1500 crew gas 19160 other
我的 Python 训练和生成 ONNX 模型的代码
car_data = pd.read_csv('vehicles.csv', header=0, index_col=None)
Input_Cols = car_data[['year']]
Predict_Col = car_data['price']
X_train, X_test, y_train, y_test = train_test_split(Input_Cols, Predict_Col, test_size=0.2)
lrm = LinearRegression()
lrm.fit(X_train, y_train)
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('year', FloatTensorType([1]))]
onx = convert_sklearn(lrm , initial_types=initial_type)
with open("CarPricePrediction.onnx", "wb") as f:
f.write(onx.SerializeToString())
我在 .Net 中的输入和输出数据 类
public class InputData
{
[ColumnName("year")]
public float Year{ get; set; }
}
public class Output
{
[ColumnName("sentence_embedding")]
public List<float> SentenceEmbedding { get; set; }
}
主要推理代码
public static class Program
{
static string ONNX_MODEL_PATH = @".\ONNX\CarPricePrediction.onnx";
static MLContext mlContext = new MLContext();
static void Main(string[] args)
{
var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<InputData, Output>(onnxPredictionPipeline);
var dt = new List<InputData>() { new InputData(){ Year = 2010 } };
Output prediction = new Output();
onnxPredictionEngine.Predict(dt, ref prediction);
Console.WriteLine($"Predicted Fare: {prediction.SentenceEmbedding.First()}");
}
static ITransformer GetPredictionPipeline(MLContext mlContext)
{
var inputColumns = new string[] { "year" };
var outputColumns = new string[] { "variable" };
var onnxPredictionPipeline = mlContext.Transforms
.ApplyOnnxModel(
outputColumnNames: outputColumns,
inputColumnNames: inputColumns,
ONNX_MODEL_PATH);
var emptyDv = mlContext.Data.LoadFromEnumerable(new InputData[] { });
return onnxPredictionPipeline.Fit(emptyDv);
}
}
我在
上遇到异常
mlContext.Model.CreatePredictionEngine<InputData, Output>(onnxPredictionPipeline)
Exception
我找出了代码中的问题。对我的代码进行更改后使其工作。
Python 代码更改
变化
initial_type = [('year', FloatTensorType([1]))]
到
initial_type = [('year', FloatTensorType([1,1]))]
C# 更改
改变这个
public class Output
{
[ColumnName("sentence_embedding")]
public List<float> SentenceEmbedding { get; set; }
}
到
public class Output
{
[ColumnName("variable")]
public float []Value { get; set; }
}
我的代码开始端到端运行。
我正在 ML.Net 创建我的第一个应用程序。
我想使用 sklearn
构建的模型来预测给定制造年份的汽车价格。
为此,我使用了如下所示的简单数据集。
> id region price year model fuel odometer transmission
> 7316814884 auburn 33590 2014 sierra 1500 crew cab slt gas 57923 other
> 7316814758 auburn 22590 2010 silverado 1500 gas 71229 other
> 7316814989 auburn 39590 2020 silverado 1500 crew gas 19160 other
我的 Python 训练和生成 ONNX 模型的代码
car_data = pd.read_csv('vehicles.csv', header=0, index_col=None)
Input_Cols = car_data[['year']]
Predict_Col = car_data['price']
X_train, X_test, y_train, y_test = train_test_split(Input_Cols, Predict_Col, test_size=0.2)
lrm = LinearRegression()
lrm.fit(X_train, y_train)
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('year', FloatTensorType([1]))]
onx = convert_sklearn(lrm , initial_types=initial_type)
with open("CarPricePrediction.onnx", "wb") as f:
f.write(onx.SerializeToString())
我在 .Net 中的输入和输出数据 类
public class InputData
{
[ColumnName("year")]
public float Year{ get; set; }
}
public class Output
{
[ColumnName("sentence_embedding")]
public List<float> SentenceEmbedding { get; set; }
}
主要推理代码
public static class Program
{
static string ONNX_MODEL_PATH = @".\ONNX\CarPricePrediction.onnx";
static MLContext mlContext = new MLContext();
static void Main(string[] args)
{
var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<InputData, Output>(onnxPredictionPipeline);
var dt = new List<InputData>() { new InputData(){ Year = 2010 } };
Output prediction = new Output();
onnxPredictionEngine.Predict(dt, ref prediction);
Console.WriteLine($"Predicted Fare: {prediction.SentenceEmbedding.First()}");
}
static ITransformer GetPredictionPipeline(MLContext mlContext)
{
var inputColumns = new string[] { "year" };
var outputColumns = new string[] { "variable" };
var onnxPredictionPipeline = mlContext.Transforms
.ApplyOnnxModel(
outputColumnNames: outputColumns,
inputColumnNames: inputColumns,
ONNX_MODEL_PATH);
var emptyDv = mlContext.Data.LoadFromEnumerable(new InputData[] { });
return onnxPredictionPipeline.Fit(emptyDv);
}
}
我在
上遇到异常mlContext.Model.CreatePredictionEngine<InputData, Output>(onnxPredictionPipeline)
Exception
我找出了代码中的问题。对我的代码进行更改后使其工作。
Python 代码更改 变化
initial_type = [('year', FloatTensorType([1]))]
到
initial_type = [('year', FloatTensorType([1,1]))]
C# 更改
改变这个
public class Output
{
[ColumnName("sentence_embedding")]
public List<float> SentenceEmbedding { get; set; }
}
到
public class Output
{
[ColumnName("variable")]
public float []Value { get; set; }
}
我的代码开始端到端运行。