You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让简易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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:57:27