C# 用于动态加载的ML.net数据结构

C# 用于动态加载的ML.net数据结构,c#,ml.net,C#,Ml.net,我在创建一个合适的数据结构时遇到了一个问题,然后可以在ML.net上下文中使用它来为训练数据创建一个新的数据结构。数据将存储在内存中,大多数在线示例都显示了通过CSV或文本文件加载数据的方法。。。所以我需要使用这里的方法 让我们从一个简单的例子开始。假设我的应用程序正在尝试加载两个数据流(都是float类型,每个数据列表中只有10个项目)。示例数据可能如下所示: public class MLCodifiedData { public MLCodifiedData(string lab

我在创建一个合适的数据结构时遇到了一个问题,然后可以在ML.net上下文中使用它来为训练数据创建一个新的数据结构。数据将存储在内存中,大多数在线示例都显示了通过CSV或文本文件加载数据的方法。。。所以我需要使用这里的方法

让我们从一个简单的例子开始。假设我的应用程序正在尝试加载两个数据流(都是float类型,每个数据列表中只有10个项目)。示例数据可能如下所示:

public class MLCodifiedData 
{
    public MLCodifiedData(string label, List<object> list)
    {
        Label = label;
        Features = list;
    }

    public List<object> Features { get; set; }
    public string Label { get; set; }
}
{Num_A: Vector<Single, 10>}
{Num_B: Vector<Single, 10>}
  • 标签:Num_A,值:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}
  • 标签:Num_B,值:{0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}
  • 这是我想用来训练算法的数据。现在,在我的应用程序中,我有一个组件加载数据并为其分配标签。。。但是,我已经尝试将此设置为泛型,以便数据可以是任何类型(即bool、float、int、string等)。。。所以,现在我将特征数据列表(即值)存储在object类型的通用列表中。该类如下所示:

    public class MLCodifiedData 
    {
        public MLCodifiedData(string label, List<object> list)
        {
            Label = label;
            Features = list;
        }
    
        public List<object> Features { get; set; }
        public string Label { get; set; }
    }
    
    {Num_A: Vector<Single, 10>}
    {Num_B: Vector<Single, 10>}
    
    在我试图从两个输入流创建训练数据的代码部分,我得到了以下内容:

    if (mlContext == null) mlContext = new MLContext(seed: 0);
    var builder = new DataViewSchema.Builder();
    
    CodifiedFloatDataStream[] inMemoryCollection = new CodifiedFloatDataStream[input.Count];
    
    for (int i = 0; i < input.Count; i++)
    {
        MLCodifiedData codifiedData = input[i].Value as MLCodifiedData;
                   
        int featureDimension = codifiedData.Features.Count;
        var vectorItemType = NumberDataViewType.Single;
        builder.AddColumn(codifiedData.Label, new VectorDataViewType(vectorItemType, featureDimension));
        float[] array = new float[codifiedData.Features.Count];
        for(int j = 0; j < codifiedData.Features.Count; j++)
        {
            GH_Number element = codifiedData.Features[j] as GH_Number;
            array[j] = (float)element.Value;
        }
    
        inMemoryCollection[i] = new CodifiedFloatDataStream(array);
     }
    
     var schema = builder.ToSchema();
     IDataView data = mlContext.Data.LoadFromEnumerable<CodifiedFloatDataStream>(inMemoryCollection, schema);
    
    if(mlContext==null)mlContext=newmlcontext(seed:0);
    var builder=new DataViewSchema.builder();
    CodecodedFloatDataStream[]inMemoryCollection=新的CodecodedFloatDataStream[input.Count];
    for(int i=0;i
    现在,当我逐步完成代码并在最后一行中放置一个断点,尝试创建IDataView对象时,我可以看到模式包含两列,如下所示:

    public class MLCodifiedData 
    {
        public MLCodifiedData(string label, List<object> list)
        {
            Label = label;
            Features = list;
        }
    
        public List<object> Features { get; set; }
        public string Label { get; set; }
    }
    
    {Num_A: Vector<Single, 10>}
    {Num_B: Vector<Single, 10>}
    
    {Num_A:Vector}
    {Num_B:Vector}
    
    对我来说,我认为这就是模式应该是什么样子,所以我认为我在这方面做得很好。但是,当我试图跨过最后一行时,我得到一个错误,它说,“类型应该包含一个名为Num_a”的成员。我被困在这里,因为我不知道如何格式化CodedFloatDataStream类或inMemoryCollection,以便使用此模式正确加载。有人能给我提供一些关于我做错了什么的指导吗