【问题标题】:ML.Net fails to load a model from storage in MVC projectML.Net 无法从 MVC 项目的存储中加载模型
【发布时间】:2018-07-08 23:43:18
【问题描述】:

我一直在使用 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 项目都在 .Net Framework 4.6.1(ML.NET 要求的 .Net 标准 2.0)上运行。控制台应用面向 x64,而 MVC 项目设置为 AnyCPU,但本地 IIS 服务器以 x64 进程加载站点。

任何帮助将不胜感激。

谢谢

编辑 根据 cmets 的要求,这里有一些代码 sn-ps:

//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 包)

【问题讨论】:

  • 您能分享一下您用来加载模型的代码吗?
  • @Jon 我已经添加了代码示例。
  • 只是路径还是modelFilePath 中也有模型文件名?这与使用WriteAsync 创建的模型相同,对吗?抱歉有这些问题。当我尝试它时它起作用了,所以试图看看你有什么不同导致它不起作用。
  • 是的@Jon 我将完整的文件路径(包括文件名和扩展名)传递给这个方法。是的,这与使用 WriteAsync 方法创建的模型文件相同。
  • 哦,LoadModelAsync,因为你调用await,它应该有async 关键字,当你调用ReadAsync 时,它也应该有await 关键字。也许这就是问题所在。

标签: c# asp.net-mvc ml.net


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多