预测引擎 - 架构不匹配:"expected scalar or known-size vector of R4, got variable-size vector"
Predection Engine - schema mismatch: "expected scalar or known-size vector of R4, got variable-size vector"
我正在尝试训练和预测具有多个特征的模型。我们将使用浮点目标调用我的数据 "Histogram",然后 Sensor1
到 Sensor6
即 float[64]
.
数据从 CSV 加载,第一列作为目标,然后是第 1-64 列传感器 1、第 65-129 列传感器 2 等
直方图class:
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。我会根据需要进行更多编辑!谢谢。
大多数 ML.NET 培训师期望固定大小的向量。
您可以使用 VectorType 属性来指定特征是矢量。下面是使用 VectorType 属性修饰后的直方图 class 的外观。
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)))
...
我正在尝试训练和预测具有多个特征的模型。我们将使用浮点目标调用我的数据 "Histogram",然后 Sensor1
到 Sensor6
即 float[64]
.
数据从 CSV 加载,第一列作为目标,然后是第 1-64 列传感器 1、第 65-129 列传感器 2 等
直方图class:
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。我会根据需要进行更多编辑!谢谢。
大多数 ML.NET 培训师期望固定大小的向量。 您可以使用 VectorType 属性来指定特征是矢量。下面是使用 VectorType 属性修饰后的直方图 class 的外观。
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)))
...