Encog CSV 加载异常:"Can't access column 15 in a file that has only 15 columns."

Encog CSV Loading Exception: "Can't access column 15 in a file that has only 15 columns."

使用 encog-core-cs,其程序集信息报告为 3.3.0.0。

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

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

我正在使用的规范化 csv 文件包含 15 列(在 Excel 中查看时通过列 "O"),我提供数字 15 作为 LoadCSV2Memory 的 "input" 参数().这是代码行。 “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)

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

prune.Process()

...Encog 在对 System.Buffer.BlockCopy(...) 的调用中抛出异常 "Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.",这是在 Encog 的 EngineArray.ArrayCopy(...) 方法中。

在尝试逐步执行代码几个小时后,我觉得如果 Internet 包含解决我可能滥用 Encog 框架的问题的解决方案肯定会很好。谢谢你。

更新:这是来自 CSV 的片段,包括 headers 和前 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

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

文件名 输入列 理想的专栏 等等

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

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

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

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

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

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