代码之家  ›  专栏  ›  技术社区  ›  MrCSharp

ml.net无法从mvc项目的存储中加载模型

  •  0
  • MrCSharp  · 技术社区  · 7 年前

    我一直在玩ml.net,想把它集成到一个asp.net mvc项目中。

    我有一个控制台应用程序,负责训练模型,然后将其保存到服务器上的一个文件夹中,然后mvc项目将加载它并使用它来预测结果。

    在我的初始测试中,控制台应用程序能够训练模型并将其保存到一个文件中,然后从该文件加载模型并预测一些结果。

    但是,MVC项目无法加载相同的模型文件,出现以下异常:

    "Message": "An error has occurred.",
    "ExceptionMessage": "Couldn't load model: 'DataLoaderModel\Transform_005\SchemaBindableMapper\InnerMapper\Predictor'",
    "ExceptionType": "System.FormatException",
    "StackTrace": " at Microsoft.ML.Runtime.Model.ModelLoadContext.LoadModel[TRes,TSig](IHostEnvironment env, TRes& result, RepositoryReader rep, Entry ent, String dir, Object[] extra)\r\n at Microsoft.ML.Runtime.Model.ModelLoadContext.LoadModelOrNull[TRes,TSig](IHostEnvironment env, TRes& result, RepositoryReader rep, String dir, Object[] extra)\r\n at Microsoft.ML.Runtime.Model.ModelLoadContext.LoadModel[TRes,TSig](IHostEnvironment env, TRes& result, String name, Object[] extra)\r\n at Microsoft.ML.Runtime.Data.SchemaBindablePredictorWrapperBase..ctor(IHostEnvironment env, ModelLoadContext ctx)\r\n at Microsoft.ML.Runtime.Data.SchemaBindablePredictorWrapper.Create(IHostEnvironment env, ModelLoadContext ctx)"
    

    有人经历过吗?奇怪的是,在控制台应用程序中加载的模型与预期的一样,但在mvc项目中却失败了。

    控制台应用程序和MVC项目都在.NETFramework4.6.1上运行(ML.NET要求的.NETStandard2.0)。当MVC项目设置为anyCPU但本地IIS服务器在x64进程中加载站点时,控制台应用程序以x64为目标。

    任何帮助都将不胜感激。

    谢谢

    编辑 根据评论中的要求,下面是一些代码片段:

    //Loading the model
        public Task<PredictionModel<Data, PredictionResult>> LoadModelAsync()
            {
                return PredictionModel.ReadAsync<SlateData, ResourcePrediction>(modelFilePath);  // this line throws the exception above
            }
    
    //The above method is called like this
    var predictionModel = await LoadModelAsync();
    

    编辑 ml.net版本0.3.0(来自nuget包)

    1 回复  |  直到 7 年前
        1
  •  1
  •   MrCSharp    7 年前

    所以我设法解决了这个问题。 我得到的异常里面有很多内部异常,我主要关注的是最内部的一个。但最外部的例外是抱怨未能通过反射创建某个对象的实例。

    mvc项目正在引用另一个项目,该项目具有用于加载和预测的所有代码。

    解决方法是在主mvc项目中添加对microsoft.ml nuget库的引用,该引用也修复了反射异常,并允许按预期加载模型。