如何在ML.NET中导入输入为未知长度浮点数组的ONNX模型?
解决ML.NET中ONNX模型动态长度输入的问题
方案1:用VariableLengthVectorType替代固定长度特性
ML.NET 1.5及以上版本支持VariableLengthVectorType特性,无需指定固定数组长度,直接标注在输入属性上即可适配任意长度的一维浮点数组:
using Microsoft.ML.Data; public class OnnxInput { [VariableLengthVectorType] [ColumnName("input1")] public float[] data { get; set; } } public class OnnxOutput { // 根据你的ONNX模型输出结构定义对应属性,示例: [ColumnName("output1")] public float[] result { get; set; } }
创建预测引擎的代码保持不变:
var mlContext = new MLContext(); var predictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxModel);
方案2:动态Schema定义(适配更灵活场景)
如果需要完全动态处理输入结构,可通过SchemaDefinition手动构建输入的动态类型:
var mlContext = new MLContext(); // 动态定义输入Schema var inputSchema = SchemaDefinition.Create(typeof(DynamicOnnxInput)); var dataColumn = inputSchema["data"]; dataColumn.ColumnType = new VectorDataType(NumberDataKind.Single, -1); // -1代表可变长度 dataColumn.Name = "input1"; // 加载ONNX模型 var onnxModel = mlContext.Model.Load("your-model-path.onnx", out var modelSchema); // 创建动态预测引擎 var predictionEngine = mlContext.Model.CreatePredictionEngine<DynamicOnnxInput, OnnxOutput>(onnxModel, inputSchema); // 使用时可传入任意长度数组 var input = new DynamicOnnxInput { data = new float[768] }; // 示例长度768 var output = predictionEngine.Predict(input);
配套的基础输入类:
public class DynamicOnnxInput { public float[] data { get; set; } }
注意事项
- 确保你的ONNX模型本身支持可变长度输入(即模型输入维度设置为动态,比如
[1, -1]格式),否则即使ML.NET端设置可变长度,运行时也会报错。 - 若使用旧版ML.NET,建议升级到1.5及以上版本以使用
VariableLengthVectorType特性。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

