如何让简易ONNX模型接收List<double>作为输入(替代float[])
如何将ONNX模型输入从float[]改为List
解决思路
你的ONNX模型定义的输入是FloatTensorType,最终必须以float类型喂给模型,但可以通过ML.NET的类型转换组件,将List<double>输入转换为模型所需的float向量,同时利用List的灵活内存特性规避大数组的连续存储问题。
具体修改步骤
1. 更新输入输出类定义
把OnnxInput的输入字段类型改为List<double>,并调整列名标识,后续用于类型转换:
public class OnnxInput { [VectorType(2)] [ColumnName("double_input")] // 定义double类型的输入列 public List<double> X { get; set; } } public class OnnxOutput { [ColumnName("variable")] public float[] y { get; set; } }
2. 调整预测Pipeline,添加类型转换逻辑
在调用ONNX模型之前,新增ConvertType转换步骤,将double类型的输入列转为模型要求的float类型列:
static ITransformer GetPredictionPipeline(MLContext mlContext) { var inputColumns = new string[]{ "float_input" }; var outputColumns = new string[] { "variable" }; var onnxPredictionPipeline = mlContext .Transforms .ConvertType("float_input", "double_input", DataKind.Single) // 将double列转成float列,匹配模型输入 .Append(mlContext.Transforms.ApplyOnnxModel( outputColumnNames: outputColumns, inputColumnNames: inputColumns, ONNX_MODEL_PATH)); var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] { }); return onnxPredictionPipeline.Fit(emptyDv); }
3. 修改调用代码,使用List作为输入
直接用List<double>构造测试输入,无需再手动转换为float数组:
private void onneximport() { MLContext mlContext = new MLContext(); var onnxPredictionPipeline = GetPredictionPipeline(mlContext); var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline); var testInput = new OnnxInput { X = new List<double> { 1, 1 } // 直接使用List<double>作为输入 }; var prediction = onnxPredictionEngine.Predict(testInput); Console.WriteLine($"Predicted: {prediction.y.First()}"); }
关键说明
ConvertType会自动处理List<double>到float向量的转换,无需手动做数组复制或类型转换,ML.NET会负责底层内存管理。- 原ONNX模型无需重新生成:我们只是在输入层做类型适配,模型本身的输入定义保持不变,完全兼容原有逻辑。
- 大向量场景适配:
List<double>支持动态扩容,无需提前分配固定大小的连续内存数组,更适合处理超大输入向量时的内存灵活调度。
内容的提问来源于stack exchange,提问作者thelsales
相关产品推荐
相关产品推荐

