ML.NET调用ONNX模型报错:无法将IDataView列绑定到字段或属性
错误原因
ONNX模型输出的discrete_actions字段数据类型为Int64(对应C#中的long类型),你在OnnxOutput类中定义的Actions属性为Int32[](对应C#中的int数组),ML.NET无法自动完成这两种不同类型向量的绑定。
解决建议
方案1:直接修改输出类属性类型(推荐,实现最简单)
将OnnxOutput类中的Actions属性类型从int[]改为long[]即可,后续如果需要使用int类型的结果,手动做强制类型转换即可:
public class OnnxOutput { [ColumnName("discrete_actions")] [VectorType(1, 1)] public long[] Actions { get; set; } public float [] Score { get;set; } } // 取值时转换为int的示例 Console.WriteLine($"Predicted Actions: {(int)prediction.Actions.First()}");
方案2:在推理管道中添加类型转换节点
如果你需要保持OnnxOutput类的int[]定义不变,可以在ApplyOnnxModel之后添加转换算子,将Int64向量转换为Int32向量:
static ITransformer GetPredictionPipeline(MLContext mlContext) { var inputColumns = new string[] { "obs_0", "action_masks", }; var outputColumns = new string[] { "discrete_actions" }; var onnxPredictionPipeline = mlContext .Transforms .ApplyOnnxModel( outputColumnNames: outputColumns, inputColumnNames: inputColumns, ONNX_MODEL_PATH) // 新增转换:将Int64类型的discrete_actions转为Int32类型 .Append(mlContext.Transforms.Conversion.ConvertType("discrete_actions", outputKind: DataKind.Int32)); var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] {}); return onnxPredictionPipeline.Fit(emptyDv); }
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

