Predection Engine - несоответствие схемы: «ожидаемый скалярный или известный вектор размера R4, полученный вектор переменного размера» - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь обучить и предсказать модель с несколькими характеристиками.Мы назовем мои данные «гистограммой» с целевым значением с плавающей запятой и от Sensor1 до Sensor6, которые равны float[64].

Данные загружаются из CSV с первым столбцом в качествеЦель, а затем столбцы 1-64 Sensor1, 65-129 Sensor2 и т. Д.

Класс гистограммы:

class Histogram
{
    [LoadColumn(0)] public float Target;
    [LoadColumn(1, 64), ColumnName("Sensor1")]
    public float[] Sensor1;
    [LoadColumn(65, 129), ColumnName("Sensor2")]
    public float[] Sensor2;
    [LoadColumn(130, 193), ColumnName("Sensor3")]
    public float[] Sensor3;
    [LoadColumn(194, 257), ColumnName("Sensor4")]
    public float[] Sensor4;
    [LoadColumn(258, 321), ColumnName("Sensor5")]
    public float[] Sensor5;
    [LoadColumn(322, 385), ColumnName("Sensor6")]
    public float[] Sensor6;
}

Обучение завершается, но при создании механизма прогнозирования с:

var predictor = trainedModel.CreatePredictionEngine<Histogram, PredictedTarget>(mlCtx);

выдает это исключение:

System.ArgumentOutOfRangeException: 'Schema mismatch for input column 'Sensor1': expected scalar or known-size vector of R4, got variable-size vector
Parameter name: inputSchema'

Я создаю конвейер обработки как:

IDataView baseTrainingDataView = mlCtx.Data.LoadFromTextFile<Histogram>(trainDataPath, hasHeader: true, separatorChar: ',');
var dataProcessPipeline = mlCtx.Transforms
            .CopyColumns(DefaultColumnNames.Label, nameof(Histogram.Target))
            .Append(mlCtx.Transforms.Normalize(nameof(Histogram.Sensor1), "Sensor1"))
            .Append(mlCtx.Transforms.Normalize(nameof(Histogram.Sensor2), "Sensor2"))
            .Append(mlCtx.Transforms.Normalize(nameof(Histogram.Sensor3), "Sensor3"))
            .Append(mlCtx.Transforms.Normalize(nameof(Histogram.Sensor4), "Sensor4"))
            .Append(mlCtx.Transforms.Normalize(nameof(Histogram.Sensor5), "Sensor5"))
            .Append(mlCtx.Transforms.Normalize(nameof(Histogram.Sensor6), "Sensor6"))
            .Append(mlCtx.Transforms.Concatenate(DefaultColumnNames.Features, "Sensor1", "Sensor2", "Sensor3", "Sensor4", "Sensor5", "Sensor6"));

Я на самом деле не уверен, какую дополнительную информацию предоставить, потому чтоэто моя первая попытка с ML.NET.Я буду редактировать больше по мере необходимости!Спасибо.

1 Ответ

1 голос
/ 26 марта 2019

Большинство тренеров ML.NET ожидают векторов фиксированного размера.Вы можете использовать атрибут VectorType, чтобы указать, является ли объект вектором.Вот как будет выглядеть ваш класс гистограммы с украшением атрибута VectorType.

class Histogram
{
    [LoadColumn(0)]
    public float Target;

    [LoadColumn(1, 64), ColumnName("Sensor1"), VectorType(64)]
    public float[] Sensor1;

    [LoadColumn(65, 129), ColumnName("Sensor2"), VectorType(64)]
    public float[] Sensor2;

    [LoadColumn(130, 193), ColumnName("Sensor3"), VectorType(64)]
    public float[] Sensor3;

    [LoadColumn(194, 257), ColumnName("Sensor4"), VectorType(64)]
    public float[] Sensor4;

    [LoadColumn(258, 321), ColumnName("Sensor5"), VectorType(64)]
    public float[] Sensor5;

    [LoadColumn(322, 385), ColumnName("Sensor6"), VectorType(64)]
    public float[] Sensor6;
}

Кроме того, сигнатура метода Normalize () - это Normalize (outputColumnName, inputColumnName).Хотя в этом случае это может не иметь значения, поскольку имена входных и выходных столбцов разрешаются в одинаковые значения (например, Sensor1), может быть безопаснее включать имена параметров в вызов, поскольку существует несколько перегрузок Normalize () спараметры по умолчанию.Хотя многословно, в том числе имена параметров явно делает ваше намерение ясным.

...
.Append(mlCtx.Transforms.Normalize(outputColumnName: "Sensor1",
                                   inputColumnName: nameof(Histogram.Sensor1)))
...
...