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

时间:2020-08-15 19:34:19

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

我希望在新版本可用后自动重新加载经过训练的机器学习模型,因此我将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

1 个答案:

答案 0 :(得分:0)

不可能

但是您可以创建外观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);