ImageClassification.Fit - IndexOutOfRangeException - PullRequest
0 голосов
/ 05 ноября 2019

Я использовал метод Fit для обучения своей модели, который генерирует исключение «Индекс находился за пределами массива».

Я создал одну библиотеку .Net Core 3.1 и UnitTesting (. Net Core 3.1) где UnitTesting вызывает свойство "Training ()" в моей библиотеке.

Этот код ссылается на пример в Учебное пособие: Автоматическая визуальная проверка с использованием обучения переноса с помощью ML.NET Image ClassificationAPI

public void Training()
{
    MLContext mlc = new MLContext();

    try
    {
        IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: AssetsRelativePath, useFolderNameAsLabel: true);
        IDataView imageData = mlc.Data.LoadFromEnumerable(images);
        IDataView shuffledData = mlc.Data.ShuffleRows(imageData);

        var preprocessingPipeline = mlc.Transforms.Conversion.MapValueToKey(inputColumnName: "Label", outputColumnName: "LabelAsKey")
            .Append(mlc.Transforms.LoadImages(outputColumnName: "Image", imageFolder: AssetsRelativePath, useImageType: false, inputColumnName: "ImagePath"));

        IDataView preProcessedData = preprocessingPipeline.Fit(shuffledData).Transform(shuffledData);

        TrainTestData trainSplit = mlc.Data.TrainTestSplit(data: preProcessedData, testFraction: 0.3);
        TrainTestData validationTestSplit = mlc.Data.TrainTestSplit(trainSplit.TestSet);

        IDataView trainSet = trainSplit.TrainSet;
        IDataView validationSet = validationTestSplit.TrainSet;
        IDataView testSet = validationTestSplit.TestSet;

        var trainingPipeline = mlc.Model.ImageClassification(
               featuresColumnName: "Image", 
               labelColumnName: "LabelAsKey", 
               arch: ImageClassificationEstimator.Architecture.ResnetV2101,
               epoch: 100, 
               batchSize: 10, 
               testOnTrainSet: false, 
               metricsCallback: (metrics) => Logger.Debug(metrics), 
               validationSet: validationSet,
               reuseTrainSetBottleneckCachedValues: true, 
               reuseValidationSetBottleneckCachedValues: true, 
               disableEarlyStopping: false
            )
            .Append(mlc.Transforms.Conversion.MapKeyToValue("PredictedLabel"));


        ITransformer trainedModel = trainingPipeline.Fit(trainSet);
    }
    catch{

    }
}

Я получаю исключение: IndexOutOfRangeException

1 Ответ

0 голосов
/ 11 ноября 2019

Может быть, некоторые ваши изображения не загружаются? Может быть, попробуйте, перед тренировкой, сохранить trainSet на диск (в виде текстового или бинарного файла) и посмотреть, продолжает ли он выдаваться?

В принципе, я подозреваю, что сами данные повреждены, ипри первом сканировании вы сразу обнаруживаете это.

...