ML模型在重新训练后不会重新加载仅在之前进行过预测的情况下

问题描述

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

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

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

这是我在事件中看到的例外情况:

enter image description here

我应该做些其他事情以获得期望的结果吗?

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

解决方法

不可能

但是您可以创建外观this的工厂类 并具有对象池设计模式

 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);