我的情况我正在尝试使用ML.net创建一个神经网络,用于分类两种信号(本质上是是或否)。我有一组数据映射到“否”,另一组数据将映射到“是”。我希望用这些数据来训练网络。
我的问题由于我的训练数据是监督的(我知道期望的输出),我如何告诉LoadFromTextFile
函数所有这些数据应该映射到“是”(或者是1,这无关紧要)
我的问题简而言之,如何在ML.Net中使用监督数据(我知道训练数据的期望输出)来训练网络?
我的数据模型:
public class Analog{ [LoadColumn(0, Global.SAMPLE_SIZE - 1)] [VectorType(Global.SAMPLE_SIZE)] public float[] DiscreteSignal { get; set; }}
加载代码:
//创建MLContextstatic MLContext mCont = new MLContext();//加载数据IDataView data = mCont.Data.LoadFromTextFile<Analog>("myYesSignalData.csv", separatorChar: ',', hasHeader: false);
回答:
ML.NET支持通过使用MultiFileSource
类将多个数据集加载到一个IDataView
中:
var loader = mCont.Data.LoadFromTextFile<Analog>(separatorChar: ',', hasHeader: false);IDataView data = loader.Load(new MultiFileSource("myYesSignalData.csv", "myNoSignalData.csv"));
然而,目前我没有看到任何方法可以让训练器知道哪些示例是正面,哪些是负面,除非在两个文件中都添加一个标签列:在“是”的文件中添加一个全1列,在“否”的文件中添加一个全0列。然后这样定义Analog
类:
public class Analog{ [LoadColumn(0, Global.SAMPLE_SIZE - 1)] [VectorType(Global.SAMPLE_SIZE)] public float[] DiscreteSignal { get; set; } [LoadColumn(Global.SAMPLE_SIZE)] public float Label { get; set; }}
可以通过一个简单的C#程序来添加标签列,例如这样:
public class AnalogNoLabel{ [LoadColumn(0, Global.SAMPLE_SIZE - 1)] [VectorType(Global.SAMPLE_SIZE)] public float[] DiscreteSignal { get; set; }}public void AddLabel(MLContext mCont){ IDataView data = mCont.Data.LoadFromTextFile<AnalogNoLabel>("myYesSignalData.csv", separatorChar: ',', hasHeader: false); var pipeline = mCont.Transforms.CustomMapping<AnalogNoLabel, Analog>((input, output) => { output.DiscreteSignal = input.DiscreteSignal; output.Label = 1; }, contractName: null); IDataView dataWithLabel = pipeline.Fit(data).Transform(data); using (var stream = new FileStream("myNewYesSignalData.txt", FileMode.Create)) mCont.Data.SaveAsText(dataWithLabel, stream);}
对于“myNoSignalData.csv”文件,可以使用类似的脚本,但将output.Label = 1
改为output.Label = 0
。