- Notifications
You must be signed in to change notification settings - Fork8
the-lans/NeuroRepository
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Назначение
Данная программа предназначена для создания и обучения многослойных полносвязных нейронных сетей прямого распространения. Основные области применения таких нейронных сетей обширны:
Прогнозирование временных рядов
Задачи классификации
Модели принятия решений
Модели управления техникой
Аппроксимация функций
Очистка сигнала от шумов (шумоподавление)
Распознавание рукописных букв, символов
Ассоциативный поиск
Сжатие информации
Кодирование/декодирование информации
Выявление значимых факторов.
Возможности (характеристики) программы состоят в следующем:
Каждый последующий слой нейронов связан с предыдущим.
Каждый слой содержит матрицу весов нейронов и вектор смещений. Все операции с сетью – это операции с матрицами и векторами.
Каждый нейрон имеет свою функцию активации и 1 гиперпараметр для неё.
Возможна случайная инициализация весов сети с помощью алгоритма Нгуен-Видроу, либо обычная случайная инициализация весов в заданном диапазоне.
В качестве алгоритма обучения используется алгоритм обратного распространения ошибки (backpropagation) с регуляризацией, коэффициентом инерции и автоадаптацией скорости обучения.
Возможность дообучения уже готовой нейросети.
Возможность использовать систему предотвращения переобучения dropout.
Есть механизм блокировки весов отдельных нейронов от изменения при обучении.
Есть возможность использования 2 целевых функций: MSE – среднеквадратичная ошибка, Cross – кросс-энтропия.
Возможность использовать Softmax для выходного слоя для задач классификации.
Есть встроенный генератор случайных данных, распределённых равномерно в заданном диапазоне.
Встроенный преобразователь для выходных данных softmax: номер класса → вектор → номер класса (one-hot encoding).
Есть возможность использования фильтрации данных на выходном слое нейросети.
Хранение и сериализация данных осуществляется с помощью формата ECSV (Extended Comma-Separated Values).
Механизм представления данных обучающих примеров для использования их несколькими нейросетями (параметр shiftout), когда входные данные одинаковы, а выходные вектора разные.
Использование тестового множества для оценки обучения.
Случайное перемешивание примеров в обучающем и тестовом множествах.
Имеется механизм для обучения нейросети на временных последовательностях.
Множественное обучение нейросети, т.е. возможность обучать нейросеть заданное количество раз на разных (или пересекающихся) примерах. Здесь также возможно дообучение сети.
Пользовательский интерфейс
Программа написана на языке C++ на платформе Qt Creator 3.0.1 (библиотека Qt 5.2.1). Возможно также нетрудное портирование кода программы и на другие платформы/библиотеки.
Окно программы выполнено в минималистичном виде (см. рисунок ниже). Идея работы программы проста – все входные и выходные данные хранятся в файлах, программа осуществляет лишь их преобразование. В графическом окне программы выводится лишь общая информация (общие логи), всё управление осуществляется несколькими кнопками.
Рис. 1. Окно программы NeuroProject.
Элементы интерфейса программы:
Текстовое поле – Используется для вывода логов.
Поле выбора задачи – Специализация программы под конкретную задачу:
<Общая задача> – Применение нейросети под любую задачу.
Trade – Применение нейросети для предсказания временных рядов. По данному типу задачи пример для обучения -trade_test (подробнее смотрите описание к нему).
Кнопка«Задать рабочую папку» – Задаётся папка, в которой хранятся конфигурационные файлы нейронной сети и файлы с данными по задаче.
Кнопка«Обучение» - Запуск обучения нейронной сети. При этом данные для обучения считываются из файлов:
В первую очередь изin_examples, in_neuronet, in_trainbp.
- Если файлin_examples не был найден, то чтение производится изout_examples.
Кнопка«Функционирование» - Запуск нейросети в режиме функционирования. При этом данные читаются из файлов:
В первую очередь изin_examples, out_neuronet.
Если файлы не были найдены, то чтение осуществляется изout_examples, in_neuronet.
Общий алгоритм действий, используемые/создаваемые файлы
Для обучения/функционирования нейронной сети используются следующие входные файлы:
in_examples.txt – Параметры и данные для обучения/функционирования нейронной сети. Здесь указываются примеры, а также производится деление примеров на обучающее, тестовое и валидационное множества.
in_neuronet.txt – Параметры модели нейронной сети. Здесь можно указать структуру нейросети для её обучения, либо предопределённую нейросеть уже с готовыми весами.
in_trainbp.txt – Параметры обучения построенной модели. Для алгоритма обучения нейросети указываются параметры этого обучения и указываются условия для прекращения процесса обучения.
Выходные данные после обучения/функционирования нейросети сохраняются в файлы:
out_examples.csv – Здесь сохраняются выходные данные, полученные после функционирования нейросети (векторoutrun) и постобработки выходных данных (векторoutpostrun).
out_neuronet.csv – В этом файле хранится полученная структура, веса и смещения нейросети.
out_trainbp.csv – Параметры, полученные после обучения нейросети. Также сюда записывается информация об изменении весов и энергии нейросети во время обучения. Данный файл используется для оценки модели нейросети и далее импортируется в файл MS Excel«Энергия обучения».
Порядок загрузки данных при обучении:
in_examples, иначеout_examples
in_neuronet
in_trainbp.
Записываемые при этом файлы:out_examples, out_neuronet,out_trainbp.
Порядок загрузки данных при функционировании:
in_examples, иначеout_examples
out_neuronet, иначеin_neuronet.
Записываемые при этом файлы:out_examples,out_neuronet.
Мы рассмотрим общий алгоритм действий при обучении/функционировании нейронной сети в решении поставленной задачи (см. рисунок ниже):
Рис. 2. Порядок работы с NeuroProject.
Составить описание и техническое задание решаемой задачи. По желанию можно воспользоваться для этого готовым шаблоном (папка в проекте«Шаблон»).
Подготовить входные файлы с параметрами и данные для обучения:in_examples,in_neuronet,in_trainbp.
Нажать кнопку«Обучение» для запуска процесса обучения. В процессе обучения рассчитываются выходы/энергия для обучающего и тестового множества примеров.
Проанализировать полученные результаты можно, открыв файлыout_examples иout_trainbp. При необходимости можно сохранить полученные результаты обучения, переименовав выходные файлы.
Графически проследить за процессом обучения можно, загрузив файлout_trainbp в файл«Энергия обучения.xlsx».
Нажать на кнопку«Функционирование» для проверки работы нейросети на валидационном множестве примеров.
Проанализировать полученные результаты можно, открыв файлout_examples.
Описание параметров файла in_examples
Теперь приступим к описанию параметров каждого конфигурационного файла для обучения и функционирования нейронной сети.
Рис. 3. Файл in_examples.txt.
В файлеin_examples хранятся данные для обучения в виде примеров. Всё множество примеров разделено на:
Обучающее множество – Используется во время обучения нейросети для снижения ошибки целевой функции.
Тестовое множество – Используется во время обучения для независимой оценки качества работы нейросети.
Валидационное множество – Используется в режиме функционирования нейронной сети в реальных условиях для выдачи готового результата. При этом выходной вектор данных можно не определять.
Общие параметры файла:
beginset – Индекс начала множества примеров. Минимальный индекс = 0.
testset – Индекс разделения обучающего и тестового множеств. Находится междуbeginset иvalidset.
validset – Индекс разделения тестового и валидационного множеств. Находится междуtestset иendset.
endset – Индекс конца множества примеров. Максимальный индекс = Общее количество примеров.
limitset – Ограничитель на загрузку примеров в программу. Еслиlimitset = 0, то загружаются все примеры. Не может быть меньшеendset.
lenIn – Количество входов для нейронной сети.
lenOut – Количество выходов для нейронной сети.
blClearTypeSet – Очищать тип примера при перемещении окна обучения (значение true/false)?
typeNormIn – Задаёт тип нормализации входа. Может принимать следующие значения:
Linear – Линейная нормализация.
SoftStep – Нормализация логистической функцией в пределах (0; 1).
Arctg – Нормализация функциейArctg в пределах (-π/2; +π/2).
Gaussian – Нормализация функцией Гаусса.
inMin – Значение минимума входа.
inMax – Значение максимума входа.
inKoef – Коэффициент входа выступает в качестве параметра для функции нормализации.
typeNormOut – Задаёт тип нормализации выхода (см. typeNormIn).
outMin – Значение минимума выхода.
outMax – Значение максимума выхода.
outKoef – Коэффициент выхода выступает в качестве параметра для функции нормализации.
lenRand – Количество случайных примеров, которые добавляются в конец всех примеров.
lenClass – Количество классов, которое используется на выходе нейронной сети. Параметр нужен для определения классификационных выборок.
blClass – Нужно ли преобразовывать номер класса на выходе нейросети в вектор (значение true/false)?
blFilter – Применение фильтра выходного вектора (значение true/false).
valFilter – Значение фильтра для выходов нейросети.
Если выход положительный и он больше значения фильтра, то выход принимается за 1, иначе за 0.
- Если выход отрицательный и он меньше значения фильтра, то выход принимается за -1, иначе за 0.
sizeClass – Размер класса для выравнивания обучающей выборки. Этот параметр определяет какого размера нужно использовать класс для обучения. ЕслиsizeClass = 0, то данный функционал отключён.
Параметры для задачиTrade:
period – Значение периода агрегации баров. По умолчаниюperiod = 1. Этот параметр задаёт количество баров малого периода (загружаемые из файлаbars.csv), из которых строятся бары большего периода. К примеру, изначально мы подготовили файл с данными по барам периода M5 (5 минут). Для того, чтобы из этих баров построить бары большего периода H1 (1 час), в параметре указываемperiod = 12 (60 минут / 5 минут = 12 периодов).
koefTg – Количество пунктов в цене. Для большинства валютных парkoefTg = 10000.
koefPrice – Коэффициент преобразования цены. Формула для предобработки следующая:
, где
– это исходная цена.
koefVolume – Коэффициент преобразования объёма. Формула для предобработки следующая:
, где
– это исходный объём.
lenInBar – Количество входных баров. Количество входов для нейросети вычисляется так:lenIn =lenInBar * 4.
Описание параметров файла in_neuronet
Рис. 4. Файл in_neuronet.txt.
Общие параметры файла:
typeLay – Массив типов слоёв нейросети. Тип слоя назван по используемой функции активации в слое. Если нейроны в слое имеют разные функции активации, то необходимо указать тип слояNone. Существуют следующие типы слоёв/нейронов (см. Приложение 1).
lenNeurons – Количество нейронов в каждом слое, включая входной.
lock – Маска для блокировки нейронов от изменения (значение 0/1). Нейроны идут здесь по порядку. Заблокированный нейрон не изменяет свои веса и смещение при обучении.
blLock – Выключатель блокировки нейронов для нейросети в целом (значение true/false). ЕслиblLock=false, то массивlock не действует.
koefLay – Коэффициенты слоёв, т.е. гиперпараметр для функции активации слоя. По умолчанию каждый коэффициент инициализируется в зависимости от используемой функции активации.
dropout – Параметр выключения нейроновdropout. Это алгоритм для предотвращения переобучения нейросети.Dropout выключает нейроны случайным образом с заданной вероятностью (значения вероятности изменяются в пределах от 0 до 1).
valueWeight – Параметр инициализации весов. Веса инициализируются случайным образом в определённых пределах, который зависит в свою очередь от этого параметра.
shiftout – Смещение выходного вектора примеров для нейросети. По умолчаниюshiftout = 0.
typeInit – Тип инициализации весов и смещений нейросети.Существуют следующие типы инициализации:
None – Без инициализации.
Empty – Инициализация случайным образом весов и смещений в пределах (-valueWeight; +valueWeight).
InitG – Инициализация методом Нгуен-Видроу.
n – Количество нейронов в текущем слое
m – Количество нейронов в предыдущем слое.
typeTarget – Вид целевой функции. Существуют следующие функции:
Тип Название Функция Производная None Нет целевой функции MSE Среднеквадратичная ошибка Cross Кросс-энтропия
Описание параметров файла in_trainbp
Рис 5. Файл in_trainbp.txt.
В файлеin_trainbp хранится информация об алгоритме обучения нейронной сети. В частности, это алгоритм обратного распространения ошибки. Общая формула изменения весов сети выглядит следующим образом (см. Приложение 2).
Общие параметры файла:
speedLearningInit - Начальная скоростьобучения. Изменяется в пределах от 0 до 1. Текущая скорость обученияspeedLearning не может быть большеspeedLearningMax.
speedLearningMax - Максимальная скорость обучения. Нужна дляограничения автоматической подстройки коэффициента обучения.Изменяется в пределах от 0 до 1.
koefIncEnergy - Коэффициент допустимогоприроста погрешности изменения энергии. Значение всегда больше 1.Алгоритм изменения коэффициента обучения работает по следующейформуле (см. Приложение 2).
decSpeedLearning - Коэффициент уменьшенияскорости обучения. Значение находится в пределах от 0 до 1.
incSpeedLearning - Коэффициент увеличенияскорости обучения. Значение всегда больше 1.
speedRegularization - Скорость регуляризации.Этот коэффициент используется при обучении для предотвращенияпереобучения.
Сама энергия регуляризации же рассчитывается по следующей формуле(-регуляризация):
ГдеK – число слоёв в сети,n иm – количество нейронов в соответствующем слое.
W – это матрица весов,B – матрица смещений.
inertia – Коэффициент инерции. Используется для создания эффекта инерционности при перемещении градиента.
maxEpoches – Максимальное количество эпох обучения. Используется в качестве условия для остановки обучения.
minError – Минимальная ошибка обучения. Используется в качестве условия для остановки обучения.
minErrorChange – Минимальное изменение энергии. Используется в качестве условия для остановки обучения.
stepReg – Шаг сохранения энергии. Энергия обучающего и тестового множества, а также снимок нейросети будут сохраняться каждыеstepReg эпох. ЕслиstepReg = 0, то такая информация сохраняться не будет.
mixtrain – Перемешивать примеры в обучающем множестве в процессе обучения (значение true/false)? Еслиmixtrain = true, то очередной обучающий пример будет браться из множества случайным образом.
mixtest – Перемешать тестовые примеры с обучающими перед обучением (значение true/false)?
blState – Механизм сохранения нейросети в матрицу состояний (значение true/false). Этот параметр действует совместно соstepReg.
minErrorTest – Минимальная ошибка тестового множества. Используется в качестве условия для остановки обучения.
blErrorTest – Использование тестового множества для оценки в процессе обучения (значение true/false).
blDropout – Использование при обучении dropout (значение true/false).
stepDropout – Шаг изменения dropout задаёт количество эпох, за которое происходит изменение текущей подсети для обучения.
blDropoutExm – Использование dropout для каждого примера в отдельности в рамках выполнения текущей эпохи обучения (значение true/false). Установка этого параметра отменяет предыдущий stepDropout.
Анализ данных выходных файлов
Рис. 6. Файл out_trainbp.csv, открытый в MS Excel.
После обучения/функционирования нейросети в рабочей папке появляются файлы, данные из которых доступны для анализа. Выходные файлы с расширением*.csv можно открыть или импортировать в стороннюю программу, например в MS Excel, где затем можно извлекать из них данные для последующих вычислений и построения графиков. Рассмотрим ключевые (не все) параметры для анализа по файлам.
Параметры файла out_examples:
data.input – Входные (уже нормализованные/предобработанные) данные для нейросети.
data.output – Выходные (также нормализованные/предобработанные) эталонные данные для обучения нейросети.
data.outrun – Выходные расчётные данные нейросети.
data.outpostrun – Данные, полученные из выходных расчётных данных после постобработки.
Параметры файла out_neuronet:
lay.weigth – Веса соответствующего слоя нейронной сети.
lay.bias – Смещения соответствующего слоя нейронной сети.
Параметры файла out_trainbp:
energyAver – Рассчитанная средняя энергия обучающего множества примеров. Шаг сохранения энергии задан параметромstepReg.
energyMax – Рассчитанная максимальная энергия обучающего множества примеров. Шаг сохранения энергии задан параметромstepReg.
energyTestAver – Рассчитанная средняя энергия тестового множества примеров. Шаг сохранения энергии задан параметромstepReg.
energyTestMax – Рассчитанная максимальная энергия тестового множества примеров. Шаг сохранения энергии задан параметромstepReg.
speedLearningHistory – Текущий коэффициент скорости обучения. Шаг сохранения коэффициента задан параметромstepReg.
state – Снимок (веса и смещения) нейросети на текущей итерации. Шаг сохранения снимка задан параметромstepReg.
Кроме всего прочего, из выходных файлов можно импортировать данные в MS Excel. Как это сделать рассмотрим ниже.
В первую очередь, необходимо выбрать системный разделитель дробной части – точку. В программе заходим:Главное меню Excel – Параметры Excel
Рис. 7. Параметры Excel в меню.
На вкладке«Дополнительно» в качестве разделителя задаём точку. Если будет задан другой разделитель, при импорте данных MS Excel распознает числа как строки.
Затем импортируем данные из текстового файла:Меню Данные – Получить внешние данные – Из текста.
Рис. 8. Изменение системного разделителя дробной части.
Рис. 9. Импорт внешних данных из текста.
Выбираем нужный нам файл и нажимаем кнопку«Импорт».
Рис. 10. Выбор файла для импорта.
Запускается мастер текстов. Указываем параметры как на скриншоте.
Рис. 11. Мастер текстов, шаг 1.
В качестве символа-разделителя выбираем точку с запятой (;) и знак равно (=), указываем ограничитель строк.
Рис. 12. Мастер текстов, шаг 2.
На этом шаге можно указать формат каждого столбца таблицы: общий, текстовый, либо дата. В конце нажимаем кнопку«Готово».
Рис. 13. Мастер текстов, шаг 3.
Импортируем данные на указанный лист MS Excel, начиная с указанной ячейки. Лучше импортировать данные на отдельный лист.
Рис. 14. Импорт данных на указанный лист.
При импорте данные разделились по отдельным ячейкам с нужным нам форматом. Теперь мы можем проанализировать эти данные каким угодно способом: произвести необходимые расчёты с помощью формул, вывести графики и диаграммы, строить сводные таблицы, применять отборы (фильтры) и сортировку. Благо MS Excel предоставляет исчерпывающие инструменты для такого анализа, в том числе с использованием программного кода на языке Visual Basic for Applications (VBA), т.е. так называемые макросы.
Рис. 15. Разделение данных после импорта.
Загрузка данных в файл «Энергия обучения»
Рис. 16. Окно открытой книги «Энергия обучения.xlsx».
Для отображения информации по обучению нейросетевой модели на конкретной задаче был создан файл«Энергия обучения.xlsx». Файл содержит следующие листы:
out_trainbp – Импортируемые данные из соответствующего файла.
График (Aver) – График, на котором отображены средняя энергия обучающего и тестового множеств.
График (Max) – График, на котором отображены максимальная энергия обучающего и тестового множеств.
Скорость обучения – График, на котором отражается изменение скорости обучения.
Для импорта данных в файл и, соответственно, обновления графиков, нажимаем:меню Данные – Обновить – Обновить все. В появившемся окне выбираем соответствующий файл с обучающими данными.
Рис. 17. Порядок импорта данных в файл «Энергия обучения.xlsx».
Создание собственных задач
Текущий проект можно доработать/расширить под свои задачи, решаемые с помощью полноснязных нейронных сетей. Для этого в соответствующих классах проекта были созданы виртуальные методы. Чтобы добавить новую задачу (новый класс задач) необходимо создать свой программный класс и наследовать все методы и поля из классаNExamples. Таким же образом можно переопределять класс обученияTrainBP, нейронной сетиINeuroNet и т.д. Но здесь мы остановимся именно на переопределении класса задачиNExamples.
В проекте уже есть класс-наследник для задачи анализа временных рядовTrade. Данный класс называетсяNTradeTg. Аналогично этому классу можно создавать свои.
Для того, чтобы создать пользовательскую задачу в проекте, нужно переопределить следующие методы классаNExamples:
doShift(int shift, bool blShift) – Перемещение указателя примеров при множественном обучении. По большей части используется для временных последовательностей.
deinit() – Виртуальный деструктор класса отдельным методом.
prerun() – Предобработка данных для нейросетевой модели. Предобработка происходит над входами и выходами примеров нейросети. Данные могут обрабатываться в несколько этапов и храниться в соответствующих полях класса.
postrun() – Постобработка данных нейросетевой модели. Постобработка выполняется на расчётном выходном векторе примеров нейросети, после этого получаются готовые к применению и анализу данные.
saveECSV(DataECSV &dt, string &parent) – Метод для сериализации (сохранения) полей класса в файл формата ECSV.
loadECSV(DataECSV &dt, string &parent) – Метод для десериализации (загрузки) полей класса из файла формата ECSV.
Также не забудьте добавить код для функционирования вашего класса в следующие части программы:
В элемент формыcomboZad добавьте название своей задачи.
Заголовочные файлы задачи в модульmainwindow.cpp.
МетодMainWindow::run – Добавьте функционал при обучении/функционировании нейросети (обработчик нажатия на соответствующие кнопки).
Рис. 18. Окно Qt Creator: создание класса пользовательской задачи.
Приложение 1. Типы слоёв/нейронов и их функции активации.
Приложение 2. Алгоритм обучения: обратное распространение ошибки с регуляризацией и автоадаптацией скорости обучения.
Прямые формулы | Обратные формулы: |
---|---|
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Здесь приняты следующие обозначения:
speedLearning – Текущий коэффициент обучения. Не стоит забывать, что этот коэффициент может меняться в процессе обучения.
inertia – Коэффициент инерции (см. ниже).
speedRegularization* – Коэффициент регуляризации.
– Изменение вектора смещений в k-ом слое в момент времени t.
Алгоритм изменения коэффициента обучения работает по следующей формуле:
ЗдесьcurEnrg – текущая энергия обучения, аprevEnrg – предыдущая энергия обучения. Причём скорость обученияspeedLearning не может быть большеspeedLearningMax.
Приложение 3. Основные формулы.
Преобразование временных рядов
koefTg - Количество пунктов в цене. По умолчаниюkoefTg = 10000.
koefPrice - Коэффициент преобразования цены.
koefVolume - Коэффициент преобразования объёма.
Формула для расчёта энергии (ошибка примеров):
E – Энергия множества примеров (средняя/максимальная).
– Изменение исходной выходной цены/объёма эталонного вектора примеров.
Инициализация методом Нгуен-Видроу
n – Количество нейронов в текущем слое
m – Количество нейронов в предыдущем слое.
Виды целевых функций
Тип | Название | Функция | Производная |
---|---|---|---|
None | Нет целевой функции | ||
MSE | Среднеквадратичная ошибка | ![]() | ![]() |
Cross | Кросс-энтропия | ![]() | ![]() |
Общая энергия примеров
Тип | Название | Средняя | Максимальная |
---|---|---|---|
None | Нет целевой функции | ||
MSE | Среднеквадратичная ошибка | ![]() | ![]() |
Cross | Кросс-энтропия | ![]() | ![]() |
ГдеK – число слоёв в сети,n иm – количество нейронов в соответствующем слое.
W – это матрица весов;B – матрица смещений.
Алгоритм обратногоDropout
– Нейроны текущего слоя (k-слой).
На этапе обучения:
На этапе тестирования:
About
Фреймворк для построения нейронных сетей, комитетов, создания агентов с параллельными вычислениями.
Topics
Resources
Uh oh!
There was an error while loading.Please reload this page.