我一直在研究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进程加载站点。
任何帮助将不胜感激。
谢谢
修改 根据注释的要求,下面是一些代码段:
//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软件包)
答案 0 :(得分:1)
所以我设法解决了这个问题。 我得到的异常内部有许多内部异常,而我主要关注最内部的异常。但是最外面的例外是抱怨无法通过反射创建某些对象的实例。
MVC项目正在引用另一个具有所有用于加载和预测代码的项目。
此问题的解决方法是在主MVC项目中也添加对Microsoft.ML nuget库的引用,该引用也修复了反射异常并允许按预期加载模型。