Encog CSV加载例外:"无法访问只有15列的文件中的第15列。"

时间:2015-01-29 19:56:51

标签: .net encog

使用encog-core-cs,其汇编信息报告为3.3.0.0。

当我使用EncogUtility.LoadCSV2Memory()时,调用将失败并显示此处标题中描述的消息。

我正在为LoadCSV2Memory()提供一个看似正确规范化的csv文件,所有值都在标题行下方,包含0到0.9999之间的浮点数...

我使用的规范化csv文件包含15列(在Excel中查看时通过列“O”),并且我将数字15作为“输入”参数提供给LoadCSV2Memory()。这是代码行。 “ normalizedTrainingFile ”是System.IO.FileSystemInfo:

let prune() =
    let trainingSet = EncogUtility.LoadCSV2Memory(normalizedTrainingFile.FullName, 15, 1, true, CSVFormat.English, false)
    let pattern = new FeedForwardPattern(InputNeurons = 25, OutputNeurons = 1, ActivationFunction = ActivationTANH())   
    let prune = new PruneIncremental(trainingSet, pattern, 100, 1, 10, StatusReporter())
    prune.AddHiddenLayer(1, 10)
    prune.AddHiddenLayer(0, 10)
    prune.Process()
    EncogDirectoryPersistence.SaveObject(trainedNetworkFile, prune.BestNetwork)

我能够通过从我提供的列数(使值14)中减去1作为LoadCSV2Memory()的输入(“count”)参数来解决这个问题,假设问题可能是0-基于索引与基于1的计数问题,但现在当我的代码执行到达时......

prune.Process()

... Encog抛出异常“偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数量。”在对Encog的EngineArray.ArrayCopy(...)方法中的System.Buffer.BlockCopy(...)的调用中。

经过几个小时的尝试逐步完成代码之后,我觉得如果互联网要包含一个可能是我滥用Encog框架的解决方案肯定会很好。谢谢。

更新:以下是CSV的摘录,包括标题和前3行数据:

"DayOfMonth(p0)","DayOfMonth(p1)","DayOfMonth(p2)","DayOfMonth(p3)","DayOfMonth(p4)","DayOfMonth(p5)","DayOfMonth(p6)","DayOfWeek(p0)","DayOfWeek(p1)","DayOfWeek(p2)","DayOfWeek(p3)","DayOfWeek(p4)","DayOfWeek(p5)","MinuteOfDay","Value"
0.755928946018455,-0.436435780471985,-0.308606699924184,-0.239045721866879,-0.195180014589707,-0.164957219768465,-0.142857142857143,-0.763762615825973,-0.440958551844098,-0.311804782231162,-0.241522945769824,-0.197202659436654,-0.166666666666667,-0.853658536585366,-0.964430519719867
0,0.87287156094397,-0.308606699924184,-0.239045721866879,-0.195180014589707,-0.164957219768465,-0.142857142857143,0,0.881917103688197,-0.311804782231162,-0.241522945769824,-0.197202659436654,-0.166666666666667,0.114982578397212,0.389052709178032
-0.755928946018455,-0.436435780471985,-0.308606699924184,-0.239045721866879,-0.195180014589707,-0.164957219768465,-0.142857142857143,0,0,0,0.966091783079296,-0.197202659436654,-0.166666666666667,0.240418118466899,0.173608551419093

1 个答案:

答案 0 :(得分:1)

如果您将上面的15更改为14,您的代码将起作用。该函数的参数是:

文件名 输入列 理想的列 等

输入列+理想列=文件中的总列数

因为你告诉它你有15个输入和1个理想,所以这个函数总共需要16个。

错误消息有点糟糕。如果您意识到列索引是基于零的,那么它会更有意义。所以它试图读取列索引15(实际列16),这在您的文件中不存在。我已将其添加到我的列表中以修改该错误消息。

更新以解决您的第二个问题:

您正在获得越界错误,因为您正在尝试使用具有14个输入的数据集训练25输入神经元网络。修改您的模式行,它将起作用:

let pattern = new FeedForwardPattern(InputNeurons = 14, OutputNeurons = 1, ActivationFunction = ActivationTANH())