如何重新训练模型 ML .NET

时间:2021-03-08 16:04:28

标签: c# ml.net

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

//准备数据 var images = LoadImagesFromDirectory(folder: 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 .多类分类 .培训师 .lbfgs最大熵( labelColumnName: "LabelAsKey", 特征列名称:“softmax2_pre_activation”); //"softmax2_pre_activation" 用于 Inception v1 //IDataViewtransformedData = 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");

然后我重新加载训练好的模型并提取这个模型待办事项 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 的返回结果为 null,无法继续重新训练模型

0 个答案:

没有答案