我创建了一个使用 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,无法继续重新训练模型