Форум программистов, компьютерный форум CyberForum.ru

Нейронные сети - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 118, средняя оценка - 4.84
Tura
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 10
03.06.2011, 22:21     Нейронные сети #1
Добрый вечер!
Можете подсказать где есть много примеров по нейронным сетям...?
Хотелось бы посмотреть и изучить!

Покидайте прог) спс) это не для универа, а для себя) так как учёба уже закончилась)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dark-code
4 / 4 / 0
Регистрация: 07.01.2011
Сообщений: 85
04.06.2011, 03:19     Нейронные сети #2
http://www.heatonresearch.com/
http://www.heatonresearch.com/book/cat/1

Но там по C# больше.
На Русском увы не знаю, если кто знает подкиньте ссылок.
Присоединяюсь к вопросу.
kjahert
48 / 48 / 5
Регистрация: 08.04.2011
Сообщений: 124
04.06.2011, 09:23     Нейронные сети #3
http://netcode.ru/cpp/?lang=&katID=9...105&artID=3994
Almaz1988
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 12
12.06.2013, 21:57     Нейронные сети #5
Добрый вечер)
Начал изучение нейронных сетей. На С++ написал многослойный персептрон.
Попробовал решить простейшую задачу - XOR ( исключающее ИЛИ ). Создал сеть из двух слоев. В скрытом слое - 2 нейрона, в выходном слое - 1 нейрон. У сети два входа. Активационная функция - F(x)= 1/ ( 1 + exp( 2 - 4*x ) ).

На вход и выход подаю:
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0

В итоге сеть не обучается, если веса генерировать рандомно. Сеть способна обучиться только задав определенную комбинацию весов.
Применив гиперболический тангенс - сеть обучается при рандомных весах. НО!!! Как я понял, гиперболический тангенс предназначен для данных в диапазоне от -1 до +1. Т.е. обучающая выборка должна выглядеть следующим образом:
-1 -1 | -1
-1 1 | 1
1 -1 | 1
1 1 | -1
Но в этом случае сеть не обучается.

В общем буду благодарен за разъяснения, что я упустил?
VTsaregorodtsev
295 / 275 / 35
Регистрация: 19.02.2010
Сообщений: 1,209
12.06.2013, 22:17     Нейронные сети #6
Almaz1988, эту активационную функцию - в морг.
Сначала вообще уберите акт.функцию - оставьте у нейронов только адаптивные сумматоры. И добейтесь, чтобы прога с любым числом слоёв и нейронов в них обучалась воспроизводству линейных зависимостей (типа y=x) на единичном отрезке или в единичном кубе. Ну и несколько выходов в сети при этом протестируйте - на одном требуйте y=x, на другом, например, у=-x или у=-0.5x. Точность (если брать средний квадрат ошибки) обучения чтобы везде достигалась не ниже 10 в минус 6 степени (дальше можно прекращать обучение и копейки точности не выжимать).
Вот когда на вырожденной в линейную сетке отладите и обратное распространение (на любое число слоёв), и найдёте приемлемый интервал шага обучения, и т.д. - вот тогда и будете переходить к простановке и тестированию работоспособности нелинейностей.

Гип.тангенс съест любые данные. Данные, в конце концов, проходят через обучаемые коэффициенты.

Ну и в меньшей степени по теме. Задача xor есть полный мастдай, ибо это никакая не репрезентативная статистическая выборка (а нейросеть при решении задачи классификации аппроксимирует именно оптимальный байесов классификатор). Так что не удивляйтесь, если для xor Вам потребуется несколько тысяч эпох обучения, тогда как, например, для гораздо более сложной задачи распознавания рукописных цифр MNIST достаточно 30-50 эпох.
Almaz1988
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 12
14.06.2013, 01:29     Нейронные сети #7
авк

Добавлено через 4 минуты
VTsaregorodtsev, как вы и сказали - выкинул активационную функцию, т.е. на выход нейрона подается значение его сумматора.
Опробовал обучение линейным зависимостям типа y=(x1+x2)/2 на однослойных и двухслойных персептронах. Получилось). Столкнулся с явлением возникновения неустойчивости в системе, когда при большой скорости обучения происходят большие результирующие изменения синаптических весов и выходы сети уходят в зашкал. В общем пришел к эвристическому выводу, описанному в книгах: "скорость обучения поменьше, эпох обучения побольше и будет счастье":-).
Завтра опробую трехслойную сеть; опробую динамическую скорость обучения, чтобы снизить количество необходимых эпох для обучения; посмотрю что даст пакетный режим обучения.
Но все же остается один главный вопрос - как обучать сеть нелинейностям?)
VTsaregorodtsev
295 / 275 / 35
Регистрация: 19.02.2010
Сообщений: 1,209
16.06.2013, 19:35     Нейронные сети #8
Да так и обучать. Поставите на нейроны гип.тангенс, нормировку входов сделаете в интервал [-1,1] или приведёте их к единичному среднему и единичной дисперсии - и всё будет оптимально.
Ну и веса синапсов надо случайно генерировать не сильно большими по модулю - где-нибудь в интервале [-0.5,0.5] или даже более узком. Чтобы не было насыщений нелин.функции.
В качестве тестовой задачи можно взять прогнозирование временного ряда - синуса или суммы синусов с разными периодами. Сгенерируйте сотню-две точек (так, чтобы синус с самым большим периодом два-три периода туда уложил), и по 5-10 предыдущим точкам прогнозируйте значение в следующей.
Я весной делал трём девушкам программы с прогнозирующими нейросетками - так в качестве универсального теста брал именно синусы. Вот кусок скриншота одной из прог - видно, что маленькая сетка (с 5 нейронами на скрытом слое) при средней амплитуде сигнала повыше, чем 5000, имеет среднюю попримерную ошибку обучения на уровне 200 единиц, т.е. около 4% от этой среднесигнальной амплитуды. Синим на картинке дан исходный сигнал, зелёным - ответ обученной сети, красным - прогноз на 4 точки вперёд. 15 нейронов если поставить - то средняя ошибка обучения около 120 единиц.
Миниатюры
Нейронные сети  
Almaz1988
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 12
16.06.2013, 21:17     Нейронные сети #9
Кстати о нормализации входов. В книгах ( книжке Хайкина например ) рекомендуют к приведении к нулевому среднему. Правильно ли я понимаю этот механизм?
Допустим 2 входа сети, подаем 3 примера:
0.3 0.5
0.4 0.5
0.2 0.5
Данный набор входных данных не нормализован, т.к. среднее значение равно 0.4.
Для нормализации входа ( приведению к нулевому среднему ) нужно отнять 0.4 из каждого значения во входном массиве:
-0.1 0.1
0.0 0.1
-0.2 0.1.
Но в той же самой книге ничего не сказано о том, что делать с выходами? Ведь для обучения линейной зависимости необходимо выходные значения необходимо изменить на то же самое число. А при обучении нелинейной зависимости ( например у = sin x ) как вообще производить нормализацию? Ведь просто вычитание исказит обучающую выборку!
VTsaregorodtsev
295 / 275 / 35
Регистрация: 19.02.2010
Сообщений: 1,209
19.06.2013, 22:35     Нейронные сети #10
Надо для каждого входа считать его среднее - и его отнимать.
Выходы тоже нужно (можно) нормализовывать. Что, есть какая-то проблема потом прибавить ранее вычтенное? Школьная алгебра, вообще-то (если y=a+b, причём b - некоторая константа, то а из этого уравнения найти проще простого)
Almaz1988
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 12
23.06.2013, 15:22     Нейронные сети #11
Прикрутил к проекту библиотеку openCV и визуализировал процесс обучения нейронной сети функции y = sin( x ) в диапазоне x = [0;4.2] ( в радианах ).
Процесс обучения сохраняется в видеофайле:
http://files.mail.ru/53199D5AE76040108D18C21D332FED46
VTsaregorodtsev, спасибо за помощь)
Ranorien
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 3
28.02.2015, 18:13     Нейронные сети #12
Добрый день, VTsaregorodtsev,

вы приводите скриншот приложения, которое прогнозирует некий колебательный процесс(как вы пишете, синус).
Уточните, пожалуйста, правильно ли я понимаю, что:
1. по введенному число входов(на скрине их 5) рассчитывается следующее значение ряда, далее это значение подается на вход вместе с другими 4мя и расчитывается следующее значение и т.д. Т.е. формируется зеленая и красная линии графика.
2. Получается, что сеть имеет структуру: 3 слоя, 5 входов, 1 скрытый слой состоящий из 5 нейронов(как показано на скрине), и 1 выход. Верно?
3. Используется ли какая-либо активационная функция в данной программе? Ведь формально, как я понимаю, она не требуется в данном случае. Гиперболический тангенс? Если используется, то зачем? Ведь как я понимаю, подобного рода функции требуются для получения на выходе 0 или 1, а в программе выход рассчитывается выходящий за эти пределы. Или тут происходит т.н. нормализация входов/выходов?

Очень буду благодарен, если поделитесь исходником сего инженерного чуда.

Заранее большое спасибо за ответ!
VTsaregorodtsev
295 / 275 / 35
Регистрация: 19.02.2010
Сообщений: 1,209
01.03.2015, 22:07     Нейронные сети #13
Ranorien,
1. Не совсем так. По 5 входам прогнозируется следующее значение, и график из этих спрогнозированных значений рисуется рядом с исходным графиком. Т.е. при рисовании зелёной линии - ошибка прогнозов не накапливается. Красная линия - да, это уже прогноз с учётом рекуррентной подачи спрогнозированного значения на вход сети, там ошибка может накапливаться (вряд ли будет самоисправляться, т.е. если прогноз пошёл в неправильную сторону - то это навсегда).
2. Правильно
3. Используется, гип.тангенс на скрытом слое. Ибо многослойная сеть без нелинейностей эквивалентна однослойной (одному слою нейронов) без нелинейностей же. Линейная комбинация линейных комбинаций есть линейная комбинация, как нас учит математика. Поэтому на скрытые слои - таки обязательно ставить нелинейность. Причём есть задачи, где наличие нелинейности и на вых.слое может быть полезным (там, правда, всё уже начинает зависеть от используемой целевой функции (особенно для задачи классификации, а не прогнозирования), и/или от схемы нормировки целевых данных).
Нормализация входов и выходов - да, происходит, каждой переменной в отдельности (я вроде бы там маштабировал каждую переменную к нулевому среднему значению и единичной дисперсии). Обратные формулы вывести для перевода прогнозов сети в реальный интервал переменной - школьная математика.

Исходниками бесплатно не делюсь, увы
Ranorien
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 3
01.03.2015, 23:10     Нейронные сети #14
VTsaregorodtsev,

Спасибо за ответ! Появилось представление, как в итоге это все должно выглядеть.
Получается, что если не использовать нелинейность, то нейронная сеть сводится к регрессионной модели вида y(i) = a0 + a1*y(i-1) + a2*y(i-2) + a3*y(i-3) + ... +am*y(i-m),
где коэффициент a1, a2, ..., am(m-число входов, i - прогнозируемая точка) - рассчитываются, например, через МНК(по сути тоже самое, что и метод обратного распределения ошибки в нейронных сетях, как я понимаю). Т.е. в итоге, однослойная нейронная сеть без нелинейности - это и есть т.н. регрессионная модель. Верно я понимаю? Так же из курсов Моделирования процессов и ТАУ помню, что для описания колебательного процесса достаточно модели второго порядка(y(i) = a0 + a1*y(i-1) + a2*y(i-2)). Проводя аналогию с нейросетями, получается, что для прогнозирования колебательного процесса будет достаточно однослойной сети с двумя входами и 1 выходом. Верно?

На счет исходников, пока попробую сам разобраться, если вдруг не получится, обращусь через ваш сайт ссылка. Ок?

Еще раз спасибо!
VTsaregorodtsev
295 / 275 / 35
Регистрация: 19.02.2010
Сообщений: 1,209
01.03.2015, 23:29     Нейронные сети #15
Да, так точно, сводится.
Но МНК - это МНК, а нейросетке можно дать и другую целевую функцию (и способ обучения=оптимизации значений коэффициентов методом обратного распространения от этого не изменится, надо будет только для этой целевой функции её производные посчитать, ибо они будут отличны от производных для МНК). Так что нейронка вполне может провести и линейную (авто)регрессию иным образом, чем МНК.

Не по теме:

Хватит или не хватит двух входов - это вопрос совсем не к той программе, из которой делался скриншот Программа была для бизнес-задачи, по показателям финансово-экономической деятельности делать прогноз на следующие периоды, и девушка предполагала совать поквартальные данные. Т.е. 4 последних квартала и вдобавок ещё один назад в прошлое, чтобы была возможность увидеть-учесть как внутригодовую сезонность, так и иметь как минимум одну "точку"-ориентир аналогичного квартала год назад. Поэтому разные синусы - это чисто модельные-тестовые данные у меня были, чтобы показать девушке, что в наших политико-экономических условиях прогноз наивными методами эконом.данных - будет совершенно неточным, по сравнению с данными, в которых имеются явные и простые зависимости. Ну и чтобы просто доказать правильность работы проги - когда на "реальных" данных ошибка большая - нужно что-то, на чём можно было бы продемонстрировать получение лучшей точности.

Сайт - да, мой, но я не вступаю в приватную переписку по неинтересным мне вопросам. Моя активность тут на форуме - это просто самореклама, перед широкой аудиторией Т.е. порепетировать за деньги - могу, тут на форуме в разделе фриланса продать исходники могу, а попереписываться по почте - увы, только по вопросам, сильно далеко выходящим за рамки нейросетевых учебников

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2015, 19:43     Нейронные сети
Еще ссылки по теме:

C++ Нейронные сети обратного распространения
C++ Нейронные сети. Написать перцептрон, который распознает введеную букву
Нейронные сети визуализация процессов обучения C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ranorien
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 3
13.03.2015, 19:43     Нейронные сети #16
VTsaregorodtsev,

Спасибо за помощь! Вроде бы не плохо получилось...
Миниатюры
Нейронные сети  
Yandex
Объявления
13.03.2015, 19:43     Нейронные сети
Ответ Создать тему
Опции темы

Текущее время: 17:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru