ML.Net AutoML получает исключение нулевой ссылки, даже если у меня есть данные?

#c# #ml.net #automl

#c# #ml.net #automl

Вопрос:

Я учусь ML.Net и пытаюсь использовать AutoML API и получаю исключение нулевой ссылки. Вопрос был обновлен с учетом моих недавних знаний и минимального количества кода для воспроизведения.

Поместите это в VSCode, и вы тоже можете столкнуться с двухмерным векторным взрывом.

 class Program
{
    static void Main(string[] args)
    {
        var mlContext = new MLContext();

        // create schema for multidimensional vector
        var autoSchema = SchemaDefinition.Create(typeof(InputData));
        var col = autoSchema[1];
        col.ColumnType = new VectorDataViewType(NumberDataViewType.Single, 3, 60);

        // fabricate some data
        var trainingData = new List<InputData>();
        var inputData = new InputData();
        inputData.MultiDimensional = new float[20,20];
        for (int i = 0; i < inputData.MultiDimensional.GetUpperBound(0); i  )
        {
            for (int j = 0; j < inputData.MultiDimensional.GetUpperBound(1); j  )
            {
                inputData.MultiDimensional[i,j] = 5; // doesn't matter
            }
        }
        trainingData.Add(inputData);

        // setup a data view
        IDataView trainingDataView = mlContext.Data.LoadFromEnumerable<InputData>(trainingData, autoSchema);

        // preview it (goes BOOM)
        var preview = trainingDataView.Preview();

        // run the experiment
        var settings = new BinaryExperimentSettings();
        settings.MaxExperimentTimeInSeconds = 60;
        ExperimentResult<BinaryClassificationMetrics> experimentResult = mlContext.Auto()
            .CreateBinaryClassificationExperiment(settings)
            .Execute(trainingDataView);
    }
}

public class InputData
{
    public bool Label { get; set; }
    public float[,] MultiDimensional { get; set; }
}
  

Документация, похоже, указывает на правильность моей настройки: https://learn.microsoft.com/en-us/dotnet/api/microsoft.ml.data.vectortypeattribute .-ctor?view=ml-dotnet#Microsoft_ML_Data_VectorTypeAttribute__ctor_System_Int32___

Чтобы исправить мою проблему с многомерным вектором, я попытался:

  • Удаление float[,] инициализаторов в InputData
  • Указание точного размера с [VectorType(3,60)] соответствующим для каждого свойства
  • [VectorType] Полностью отключив атрибут и используя autoschema для его установки.
  • [VectorType] Полностью отключив атрибут и не используя autoschema, чтобы разрешить ML.net разберитесь с этим сами по себе
  • Добавление просто [VectorType()] , хотя в документах говорится, что это для одномерных массивов.

Теперь мой вопрос: как правильно использовать векторы с более чем 1 измерением в AutoML части ML.Net ? Возможно ли это вообще?

Комментарии:

1. Просто любопытно, есть ли ошибка при загрузке перечисляемого без autoSchema параметра?

2. Это отличное предложение! Я попробовал это, хотя то же исключение.

3. Что произойдет, если вы это сделаете trainingDataView.Preview() ? Кроме того, возможно ли получить выборку данных?

4. Интересно — я получил такое же исключение при выполнении предварительного просмотра. Я только что попытался добавить атрибут [NoColumn] для всех многомерных векторов, и исключение исчезло. Есть ли что-то, что я делаю неправильно с этим? Это кажется правильным из документации: learn.microsoft.com/en-us/dotnet/api /…

5. Хорошая находка! Я видел, что вы поставили здесь проблему. Надеюсь, команда сможет исправить это для вас в ближайшее время 🙂

Ответ №1:

Ого, обнаружил, что мой собственный вопрос спустя годы все еще открыт. Из-за проблемы с github, опубликованной в комментариях, это по-прежнему невозможно. Эта проблема с github в 2022 году подтверждает, что это все еще так.