Asp.net web api ml.net模型适用于控制台应用程序,但不适用于web api

Asp.net web api ml.net模型适用于控制台应用程序,但不适用于web api,asp.net-web-api,ml.net,ml.net-model-builder,Asp.net Web Api,Ml.net,Ml.net Model Builder,我已经用ml.net model builder创建了一个MLModel,它与“消费”控制台应用程序和硬编码输入值一起工作。我想进入下一步,用web api提供值。我正在使用他们的教程示例的修改版本,介绍如何在web api中使用mlmodel。当我在webapi中使用postman时,我得到以下错误: System.InvalidOperationException:'无法将类型'Single'上的映射应用于列'PG',因为它具有类型'String'' mlmodel从model builde

我已经用ml.net model builder创建了一个MLModel,它与“消费”控制台应用程序和硬编码输入值一起工作。我想进入下一步,用web api提供值。我正在使用他们的教程示例的修改版本,介绍如何在web api中使用mlmodel。当我在webapi中使用postman时,我得到以下错误:

System.InvalidOperationException:'无法将类型'Single'上的映射应用于列'PG',因为它具有类型'String''

mlmodel从model builder成功构建,默认代码从model builder生成。在模型上运行带有硬编码值的消费控制台应用程序是可行的

以下是modelinput的相关代码

//***************************************************************************************** //* * //*这是由Microsoft ML.NET CLI(命令行界面)工具自动生成的文件* //* * //*****************************************************************************************

using Microsoft.ML.Data;

namespace JobClassMLModelML.Model.DataModels
 {
    public class ModelInput
    {
        [ColumnName("EducationLevel"), LoadColumn(0)]
        public float EducationLevel { get; set; }


        [ColumnName("Experience"), LoadColumn(1)]
        public float Experience { get; set; }


        [ColumnName("OrgImpact"), LoadColumn(2)]
        public float OrgImpact { get; set; }


        [ColumnName("ProblemSolving"), LoadColumn(3)]
        public float ProblemSolving { get; set; }


        [ColumnName("Supervision"), LoadColumn(4)]
        public float Supervision { get; set; }


        [ColumnName("ContactLevel"), LoadColumn(5)]
        public float ContactLevel { get; set; }


        [ColumnName("FinancialBudget"), LoadColumn(6)]
        public float FinancialBudget { get; set; }


        [ColumnName("PG"), LoadColumn(7)]
        public string PG { get; set; }


    }
}
using System;
using Microsoft.ML.Data;

namespace JobClassMLModelML.Model.DataModels
{
    public class ModelOutput
    {
        // ColumnName attribute is used to change the column name from
        // its default value, which is the name of the field.
        [ColumnName("PredictedLabel")]
        public String Prediction { get; set; }
        public float[] Score { get; set; }
    }
}
这里是模型输出

//***************************************************************************************** //* * //*这是由Microsoft ML.NET CLI(命令行界面)工具自动生成的文件* //* * //*****************************************************************************************

using Microsoft.ML.Data;

namespace JobClassMLModelML.Model.DataModels
 {
    public class ModelInput
    {
        [ColumnName("EducationLevel"), LoadColumn(0)]
        public float EducationLevel { get; set; }


        [ColumnName("Experience"), LoadColumn(1)]
        public float Experience { get; set; }


        [ColumnName("OrgImpact"), LoadColumn(2)]
        public float OrgImpact { get; set; }


        [ColumnName("ProblemSolving"), LoadColumn(3)]
        public float ProblemSolving { get; set; }


        [ColumnName("Supervision"), LoadColumn(4)]
        public float Supervision { get; set; }


        [ColumnName("ContactLevel"), LoadColumn(5)]
        public float ContactLevel { get; set; }


        [ColumnName("FinancialBudget"), LoadColumn(6)]
        public float FinancialBudget { get; set; }


        [ColumnName("PG"), LoadColumn(7)]
        public string PG { get; set; }


    }
}
using System;
using Microsoft.ML.Data;

namespace JobClassMLModelML.Model.DataModels
{
    public class ModelOutput
    {
        // ColumnName attribute is used to change the column name from
        // its default value, which is the name of the field.
        [ColumnName("PredictedLabel")]
        public String Prediction { get; set; }
        public float[] Score { get; set; }
    }
}
我分别在jobclassdata和jobclassprediction的等效webapi类中克隆了modelinput和modeloutput类

运行的控制台应用程序:

using System;
using Microsoft.ML;
using JobClassMLModelML;
using JobClassMLModelML.Model.DataModels;

namespace ConsumeApp
{
    class Program
    {
        static void Main(string[] args)
        { // Load the model
            MLContext mlContext = new MLContext();
            ITransformer mlModel = mlContext.Model.Load("MLModel.zip", out 
var modelInputSchema);
            var predEngine = 
mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

            // Use the code below to add input data
            var input = new ModelInput();
            // input.

            input.ContactLevel = 5;
            input.EducationLevel = 5;
            input.Experience = 5;
            input.FinancialBudget = 5;
            input.OrgImpact = 5;
            input.ProblemSolving = 5;
            input.Supervision =5;
            //input.PG = "PG01";

            // Try model on sample data
            ModelOutput result = predEngine.Predict(input);
            Console.WriteLine($"Predicted value: {result.Prediction} ");

        }
    }
}
预期结果将是预测的paygrade,如PG03。相反,错误是

System.InvalidOperationException:'无法将类型'Single'上的映射应用于列'PG',因为它具有类型'String''

排队

            JobClassPrediction prediction = 
_predictionEnginePool.Predict(input);
json输入的格式是否没有编译错误且控制台应用程序正常工作


谢谢

控制台应用程序是否仍然可以使用
input.PG
uncommented?您是否使用model Builder将PG建模为字符串或数字?控制台应用程序仍然可以使用input.PG uncommented。由于未注释或注释的web api在我上面提供的代码中都不起作用,因此它被建模(定义)为model builder的字符串。生成的代码确认了modelinput和modeloutput类的defns。在一个单独的解决方案和项目中,为了以防万一,我甚至尝试在PG上使用数字模型生成器。Console应用程序也对reqd进行了修改,告诉它预测值是float等,而不是字符串。在这两种情况下,中都出现了类似的错误消息。在数字示例中,它有一些关于Uint32(0-9)不能转换为单个的东西。在这两个示例中,控制台应用程序工作了,但使用postman的web api没有。控制台应用程序是否仍然可以使用
input.PG
uncommented?是否使用model Builder将PG建模为字符串或数字?控制台应用程序仍然可以使用input.PG uncommented。由于未注释或注释的web api在我上面提供的代码中都不起作用,因此它被建模(定义)为model builder的字符串。生成的代码确认了modelinput和modeloutput类的defns。在一个单独的解决方案和项目中,为了以防万一,我甚至尝试在PG上使用数字模型生成器。Console应用程序也对reqd进行了修改,告诉它预测值是float等,而不是字符串。在这两种情况下,中都出现了类似的错误消息。在数字示例中,它有一些关于Uint32(0-9)不能转换为单个的东西。在这两个示例中,控制台应用程序都可以工作,但使用postman的web api不能