Predection Engine-模式不匹配:“ R4的预期标量或已知大小的向量,得到了可变大小的向量”

时间:2019-03-18 17:26:35

标签: c# machine-learning ml.net

我正在尝试训练和预测具有多种功能的模型。我们将我的数据称为“直方图”,其浮点为Target,从Sensor1Sensor6float[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 个答案:

答案 0 :(得分:1)

大多数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)))
...