我正在学习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__
为了解决我的多维向量问题,我尝试了:
- 删除
InputData
中的float[,]
初始化程序 - 使用
[VectorType(3,60)]
为每个属性指定适当的确切大小 - 完全关闭
[VectorType]
属性并使用autoschema进行设置 - 完全关闭
[VectorType]
属性,不使用autoschema让ML.net自己解决问题 - 只添加
[VectorType()]
,尽管文档中说这是针对一维数组的
我现在的问题是-在ML.Net的AutoML部分中使用超过1维的向量的正确方法是什么?这可能吗?
哦,哇,多年后我发现自己的问题仍然悬而未决。从评论中发布的github问题来看,这仍然是不可能的。2022年的github问题证实了这一点。