Исключение загрузки Encog CSV: "Не удается получить доступ к столбцу 15 в файле, который имеет только 15 столбцов".

Использование encog-core-cs, информация о сборке которого составляет 3.3.0.0.

Когда я EncogUtility.LoadCSV2Memory() вызов не удается с сообщением, описанным в заголовке здесь.

Я предоставляю LoadCSV2Memory () что-то вроде правильно нормализованного csv-файла, со всеми значениями ниже строки заголовка, содержащей плавающие числа от 0 до 0.9999...

Нормализованный CSV-файл, который я использую, содержит 15 столбцов (через столбец "O" при просмотре в Excel), и я указываю число 15 в качестве аргумента "input" для 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)

Я могу преодолеть эту проблему, вычитая 1 из числа столбцов (делая значение 14), которое я предоставлял в качестве входного ("счетчик") аргумента для LoadCSV2Memory (), предполагая, что проблема может быть в индексе на основе 0 против 1-я проблема с подсчетом, но теперь, когда выполнение моего кода достигает...

prune.Process()

... Encog генерирует исключение "Смещение и длина вышли за пределы массива или счетчика больше, чем количество элементов от индекса до конца исходной коллекции". в вызове System.Buffer.BlockCopy (...), который находится в методе Encog EngineArray.ArrayCopy (...).

После нескольких часов попыток пройтись по коду, я чувствую, что было бы неплохо, если бы в Интернете было решение, которое, скорее всего, является моим неправильным использованием фреймворка Encog. Спасибо.

Обновление: вот фрагмент из CSV, включающий заголовки и первые 3 строки данных:

"DayOfMonth(р0)","DayOfMonth(р1)","DayOfMonth(р2)","DayOfMonth(р3)","DayOfMonth(р4)","DayOfMonth(P5)","DayOfMonth(р6)","DayOfWeek(р0)","DayOfWeek(р1)","DayOfWeek(р2)","DayOfWeek(р3)","DayOfWeek(р4)","DayOfWeek(P5)","MinuteOfDay","Значение"
+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 ответ

Решение

Если вы измените 15 выше на 14, ваш код будет работать. Параметры для функции:

столбцы ввода имени файла идеальные столбцы и т. д.

входные столбцы + идеальные столбцы = общее количество столбцов в файле

Поскольку вы говорите, что у вас есть 15 входов и 1 идеал, функция ожидает 16 итогов.

Сообщение об ошибке несколько плохое. Это имеет немного больше смысла, если вы понимаете, что индексы столбцов начинаются с нуля. Поэтому он пытается прочитать индекс столбца 15 (фактический столбец 16), которого нет в вашем файле. Я добавил его в свой список, чтобы исправить это сообщение об ошибке.

Обновлено с учетом вашего второго вопроса:

Вы получаете ошибку выхода за границы, потому что вы пытаетесь обучить 25 входных нейронных сетей с набором данных, который имеет 14 входов. Измените эту строку шаблона так, чтобы она работала:

let pattern = new FeedForwardPattern(InputNeurons = 14, OutputNeurons = 1, ActivationFunction = ActivationTANH()) 
Другие вопросы по тегам