【问题标题】:How To Re-Train model ML .NET如何重新训练模型 ML .NET
【发布时间】:2021-03-08 16:04:28
【问题描述】:

我创建了一个项目来使用 LbfgsMaximumEntropy 算法对图像进行分类。 一步一步来做:

//准备数据 var images = LoadImagesFromDirectory(文件夹: assetsRelativePath, useFolderNameAsLabel: true);

        //Load the images
        var imageData = mlContext.Data.LoadFromEnumerable(images);

        //Blance the data
        var shuffledData = mlContext.Data.ShuffleRows(imageData);

        var trainSplit = mlContext.Data.TrainTestSplit(data: shuffledData, testFraction: 0.10);

        var trainSet = trainSplit.TrainSet;
        var testSet = trainSplit.TestSet;

var trainer = mlContext .MulticlassClassification .培训师 .Lbfgs最大熵( labelColumnName: "LabelAsKey", 特征列名:“softmax2_pre_activation”); //Inception v1 的“softmax2_pre_activation” //IDataView transformData = dataPrepTransformer.Transform(trainSet);

        var trainingPipeline = 
             mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "LabelAsKey", inputColumnName: "Label")
             .Append(mlContext.Transforms.LoadImages(outputColumnName: "image_object", imageFolder: @"E:\ThienNguyen\Sources\ML\ML.Net\DeepLearning_ImageClassification_Binary\DeepLearning_ImageClassification_Binary\assets\", inputColumnName: nameof(ImageData.ImagePath)))
                        .Append(mlContext.Transforms.ResizeImages(outputColumnName: "image_object_resized",
                                                                    imageWidth: ImageSettingsForTFModel.ImageWidth, imageHeight: ImageSettingsForTFModel.ImageHeight,
                                                                    inputColumnName: "image_object"))
                        .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", inputColumnName: "image_object_resized",
                                                                    interleavePixelColors: ImageSettingsForTFModel.ChannelsLast,
                                                                    offsetImage: ImageSettingsForTFModel.Mean))
            .Append(mlContext.Model.LoadTensorFlowModel(inputTensorFlowModelFilePath).
                                ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2_pre_activation" },
                                                    inputColumnNames: new[] { "input" },
                                                    addBatchDimensionInput: true))
          
            //.Append(mlContext.Transforms.Conversion
            //.MapKeyToValue("PredictedLabelValue", "PredictedLabel"))
            ;
        ITransformer dataPrepTransformer = trainingPipeline.Fit(trainSet);
        IDataView transformedData = dataPrepTransformer.Transform(trainSet);

        var model = trainingPipeline.Append(trainer)
              .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabelValue", "PredictedLabel"))
            .Fit(transformedData)
            ;

        ClassifySingleImage(mlContext, model);

        // Save Data Prep transformer
        mlContext.Model.Save(dataPrepTransformer, trainSet.Schema, "data_preparation_pipeline.zip");
  
        // Save Trained Model
        mlContext.Model.Save(model, trainSet.Schema, "model.zip");

然后我重新加载训练好的模型并提取这个模型 todo DataViewSchema dataPrepPipelineSchema, modelSchema;

        // Load data preparation pipeline
        ITransformer dataPrepPipeline = mlContext.Model.Load("data_preparation_pipeline.zip", out dataPrepPipelineSchema);

        // Load trained model
        ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);

        // Extract trained model parameters
        var originalModelParameters =
                    ((Microsoft.ML.Data.TransformerChain<Microsoft.ML.ITransformer>)trainedModel).LastTransformer;

但是 originalModelParameters 的返回结果可以为空,我无法继续重新训练模型

【问题讨论】:

    标签: c# ml.net


    【解决方案1】:
    var lastTransformer = (trainedModel as TransformerChain<ITransformer>).LastTransformer as ISingleFeaturePredictionTransformer<object>;
    
    var originalModelParameters = lastTransformer.Model as MaximumEntropyModelParameters;
    

    您必须将 lastTransformer 类型转换为 ISingleFeaturePredictionTransformer&lt;TModel&gt; 才能提取特征列名和类型。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.ml.isinglefeaturepredictiontransformer-1?view=ml-dotnet

    您可以从那里从预训练模型的模型属性中提取参数。将模型类型转换为学习者的参数类(在本例中为 MaximumEntropyModelParameters)。 https://docs.microsoft.com/en-us/dotnet/machine-learning/how-to-guides/retrain-model-ml-net

    【讨论】:

    • 感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2019-06-18
    • 2019-07-19
    • 2017-03-09
    相关资源
    最近更新 更多