首页 > 解决方案 > ML 模型在重新训练后不会重新加载(仅在之前进行过预测的情况下)

问题描述

我希望在新版本可用后自动重新加载经过训练的机器学习模型,因此我设置watchForChangestrue

services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
                  .FromFile(
                  modelName: Constants.ModelName,
                  filePath: Constants.ModelFileName,
                  watchForChanges: true);

似乎只有在重新训练模型之前没有进行预测时它才有效。

这是我在事件中看到的一个例外:

在此处输入图像描述

我应该做其他事情以获得理想的结果吗?

您可以看到演示此问题的示例项目:https ://github.com/alexandermujirishvili/DotnetMLWatchForChanges/tree/master

标签: c#asp.net-core.net-coreml.net

解决方案


这是不可能的

但是您可以创建一个工厂类来查看这个 并使用对象池设计模式

 public class PredictionEngineObjPool<T>
{
    private readonly ConcurrentBag<T> _objects;
    private readonly Func<T> _objectGenerator;

    public PredictionEngineObjPool(Func<T> objectGenerator)
    {
        _objectGenerator = objectGenerator ?? throw new ArgumentNullException(nameof(objectGenerator));
        _objects = new ConcurrentBag<T>();
    }

    public T Get()
    {
        var result = _objects.TryTake(out T item) ? item : _objectGenerator();

        return result;
    }

    public void Return(T item)
    {
        _objects.Add(item);
    }
}

然后创建一个经理

 public class PredictionManager
{
    public Tdest Predict<Tsrc, Tdest>(string modelName,Tsrc example) where Tsrc : class where Tdest : class, new()
    {
        var mlContext = new MLContext();
       //create your engine
    }
}

在你的程序中使用

var pool = new PredictionEngineObjPool<PredictionManager>(() => new PredictionManager());

var _predictionManager = pool.Get();

var  prediction= _predictionManager.Predict<ModelInput, ModelOutput>("name", input);

推荐阅读