【问题标题】:Using ML.NET's CreatePredictionEngine with emitted types将 ML.NET 的 CreatePredictionEngine 与发出的类型一起使用
【发布时间】:2021-01-21 14:03:59
【问题描述】:

对于我正在进行的项目,我需要使用ML.NETCreatePredictionEngine 方法和TSrcTDst 的发射类型。我用System.Reflection.Emit 发送那些。

以下是我创建动态预测引擎的方法:

dynamic dynamicPredictionEngine;
var genericPredictionMethod = mlContext.Model.GetType().GetMethod("CreatePredictionEngine", new[] { typeof(ITransformer), typeof(DataViewSchema) });
var predictionMethod = genericPredictionMethod.MakeGenericMethod(inputObject.GetType(), outputObject.GetType());
dynamicPredictionEngine = predictionMethod.Invoke(mlContext.Model, new object[] { TrainedModel, PredictionPipeline });

这里,inputObjectoutputObject 是我发出的类的实例。

然后,我像这样运行预测引擎:

var result = dynamicPredictionEngine.Predict(inputObject)

但我得到以下异常:

'The best overloaded method match for 'Microsoft.ML.PredictionEngineBase<Object0f33ea95-c496-4c57-bd2c-728bb65dd0a9,Object5623e4bd-ba82-42cf-876f-5e11a5cb8bb2>.Predict(Object0f33ea95-c496-4c57-bd2c-728bb65dd0a9)' has some invalid arguments'

您在此处看到的 GUID 是我发出的类的名称。

为了调试它,我尝试手动创建一个与发射的类具有相同属性的类,然后再次运行预测引擎,手动创建的类为TSrc,并将发射的类保持为TDst。这一次,效果很好。

我查看调试器将发出的输入类与手动创建的类进行比较,它们似乎匹配(TaxiTrip 是我创建的类的名称):

Debugger screenshot

作为参考,这是我的 TaxiTrip 类的定义方式

namespace VL.ML
{
    class TaxiTrip
    {
        public string VendorId { get; set; }
        public string RateCode { get; set; }
        public float PassengerCount { get; set; }
        public float TripTime { get; set; }
        public float TripDistance { get; set; }
        public string PaymentType { get; set; }
        public float FareAmount { get; set; }
    }
}

有人知道这里发生了什么吗?

我已经在 SO 上偶然发现了 this question,但我的问题看起来不同:正如我所说,如果我手动创建一个没有任何属性的类(见上文),Predict 就可以正常工作。另外,TDst 似乎可以使用我发出的类型,那为什么TSrc 会失败?

如有必要,很乐意提供更多详细信息。

提前致谢!

【问题讨论】:

  • 只是好奇,您有什么理由使用反射来进行调用而不是使用预测引擎或预测引擎池?
  • 看看我对类似问题的解决方案。我给出了使用发出的代码来创建 PredictionEngine 的示例代码。 stackoverflow.com/questions/66893993/…

标签: c# reflection.emit ml.net


【解决方案1】:

你必须调用 Predict 方法:

var predictMethod = dynamicPredictionEngine.GetType().GetMethod("Predict", new[] { runtimeType });
var predict = predictMethod.Invoke(dynamicPredictionEngine, new[] { inputObject });

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2013-08-03
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多