如何使用现有ML.NET模型,以JSON为输入无需额外代码完成预测
问题解答
完全可以实现你要的效果,不需要为每个新模型单独编写调用逻辑、也不需要重新编译项目,这种场景在C#生态下生成.zip格式模型的常用框架ML.NET中有原生支持。
核心实现思路
不需要预定义强类型的输入/输出类,利用ML.NET的动态数据处理能力直接适配JSON输入:
- 加载.zip模型后可以通过
InputSchema属性自动读取模型要求的输入字段规则,不需要硬编码字段结构 - 传入字段匹配的JSON数据后,只需按照Schema要求做类型转换,将JSON数据映射为动态的
IDataView对象即可传入模型执行预测 - 预测结果也可以从输出的
IDataView中按字段名动态读取,无需预定义输出类
关键实现代码示例
using Microsoft.ML; using System.Text.Json; // 初始化MLContext var mlContext = new MLContext(); // 直接加载模型文件,不需要提前指定输入输出类型 ITransformer model = mlContext.Model.Load("你的模型文件路径.zip", out var modelInputSchema); // 解析输入JSON var inputJson = "{\"字段1\": 1.2, \"字段2\": \"分类值\", \"字段3\": 5}"; var inputDict = JsonSerializer.Deserialize<Dictionary<string, object>>(inputJson); // 将字典转换为符合Schema要求的动态行 var inputRows = new List<Dictionary<string, object>> { inputDict }; var inputDataView = mlContext.Data.LoadFromEnumerable(inputRows, modelInputSchema); // 执行预测 var outputDataView = model.Transform(inputDataView); // 动态读取预测结果 var predictions = mlContext.Data.CreateEnumerable<Dictionary<string, object>>(outputDataView, reuseRowObject: false).ToList(); var result = predictions.First()["预测结果字段名"];
注意事项
- 必须保证输入JSON的字段名、数据类型和模型训练时的输入完全一致,例如训练时定义为
float的字段不要传入整数或字符串,否则会触发类型匹配错误 - 如果你的.zip模型不是ML.NET生成的自定义格式,需要确认模型是否支持动态读取输入Schema,只要框架提供对应API也可以参照以上逻辑实现
内容的提问来源于stack exchange,提问作者user3284717
相关产品推荐
相关产品推荐

