C# 预检测引擎-架构不匹配:“0”;期望R4的标量或已知大小向量,得到可变大小向量“;
我试图训练和预测一个具有多种特征的模型。我们将我的数据称为“直方图”,带有一个浮点目标和C# 预检测引擎-架构不匹配:“0”;期望R4的标量或已知大小向量,得到可变大小向量“;,c#,machine-learning,ml.net,C#,Machine Learning,Ml.net,我试图训练和预测一个具有多种特征的模型。我们将我的数据称为“直方图”,带有一个浮点目标和Sensor1到Sensor6,它们是float[64] 数据从CSV加载,第一列作为目标,然后是第1-64列Sensor1、65-129列Sensor2等 直方图类: class Histogram { [LoadColumn(0)] public float Target; [LoadColumn(1, 64), ColumnName("Sensor1")] public floa
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);
我正在创建处理管道,如下所示:
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"));
IDataView baseTrainingDataView=mlCtx.Data.LoadFromTextFile(trainDataPath,HashHeader: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,“传感器1”、“传感器2”、“传感器3”、“传感器4”、“传感器5”、“传感器6”);
实际上,我不确定还需要提供哪些信息,因为这是我第一次尝试使用ML.NET。我会根据需要编辑更多!谢谢。大多数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)))
...
您能显示从文件读取的代码吗?@Jon,
mlCtx.Data.LoadFromTextFile
与CSV文件trainDataPath
一起提供,这有助于通过之前出现异常的行!但是,现在predictor.Predict(sample)
出现运行时异常。但无论如何,你已经赢得了赏金@帕特里克,你犯了什么错误?这很可能是PredictedTarget类的模式理解问题。您的PredictedTarget类中是否有保存回归值的class属性上的[ColumnName(“Score”)]属性装饰?@wgiri,我使用相同的直方图
类,填充除目标
之外的所有内容-将其保留为零。异常为System.InvalidOperationException:“由于对象的当前状态,操作无效。”能否发布PredictedTarget类的定义?
...
.Append(mlCtx.Transforms.Normalize(outputColumnName: "Sensor1",
inputColumnName: nameof(Histogram.Sensor1)))
...