|
|
|
|
Рейтинг 4.60/5:
|
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
|||||||||||
Не получается реализовать алгоритм обратного обучения в нейросети30.12.2020, 05:27. Показов 1031. Ответов 12
Здравствуйте. Написал алгоритм для обучения нейросети по обратному распространению ошибок. Очень недолго изучаю темы нейронных сетей, пока сложно понять ее, помогите разобраться.
У меня есть 3 эллипса, которым принадлежат точки. Пытаюсь научить сеть разделять точки на небольшой плоскости на 3 группы, по принадлежности к эллипсам соответственно. Получается 2 входа (координаты) и 3 выхода, которые должны выдавать в одном 1, а в остальных двух 0. Между ними скрытый слой из N нейронов. Вроде написал все, но сеть не учится, выдает то ли случайные значения, или просто одинаковые выводы на любые входные данные, сложно понять. Уже не понимаю, где ошибку допускаю, может алгоритм неправильно запрограммировал, или синтаксическая ошибка какая-то. Больше всего подозрений на изменение весов, скорее всего в нем проблема, для меня это самая непонятная часть. Ее код:
1. Проходим по каждому нейрону выходного слоя, в нем по каждому весу скрытого слоя, плюс коэффициент сдвига 2. Перемножаем для изменения веса все элементы:
4. Для скрытого слоя суммируем ошибку, перемножая для каждого выходного нейрона ошибку eOut[oNode], производную fDerivative(activOut[oNode]) и значение веса связи нейрона outW[oNode][hNode]. 5. Перемножаем все элементы для каждого веса связи входного и скрытого слоев:
Вроде оба пункта аналогичны, может сам алгоритм я неправильно выполняю? Буду очень признателен за помощь, уже долго мучаюсь над задачей. Дальше весь код программы с функциями и переменными:
0
|
|||||||||||
| 30.12.2020, 05:27 | |
|
Ответы с готовыми решениями:
12
Алгоритм обучения нейросети Определение адаптивного шага обучения алгоритм обратного распространения ошибки Процесс обучения нейросети |
|
698 / 574 / 75
Регистрация: 20.09.2014
Сообщений: 3,726
|
|
| 30.12.2020, 07:02 | |
|
Обновлять веса OutW и HidW следует в самом конце, когда будут посчитаны все OutDW и HidDW.
А то получается HidW обновляются от обновленной половинки нейросети, хотя по ней еще не прогоняли в прямом направлении (не испытана). Надо от старой половинки нейросети обновлять. Уменьшить etta до 0.05.
0
|
|
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
|
| 30.12.2020, 07:11 [ТС] | |
|
Mikhaylo, В смысле пройти по всей выборке, поделить изменения весов на число выборок, и потом их поменять? Или что-то другое имеете в виду? Просто в масштабе одной выборки они вроде не конфликтуют
0
|
|
|
698 / 574 / 75
Регистрация: 20.09.2014
Сообщений: 3,726
|
||||||
| 30.12.2020, 07:17 | ||||||
0
|
||||||
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
|
| 30.12.2020, 07:24 [ТС] | |
|
Mikhaylo, Понял, переписал, но результат от этого не меняется - на выходе все также нет обучения
0
|
|
|
698 / 574 / 75
Регистрация: 20.09.2014
Сообщений: 3,726
|
|
| 30.12.2020, 07:46 | |
|
Проверьте формулы вычисления ошибок DW.
0
|
|
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
|
| 30.12.2020, 08:10 [ТС] | |
|
Mikhaylo, Да я бы с удовольствием, уже 2 раза их переписывал, ничего не вижу в формуле. Может глаз замылился, или алгоритм неверный. Изучал и адаптировал отсюда
Как я написал, я в этом не очень разбираюсь, с математикой как таковой проблем нет, а с применением этих запутанных формул имею трудности. Потому и обратился за помощью в исправлении алгоритма
0
|
|
|
698 / 574 / 75
Регистрация: 20.09.2014
Сообщений: 3,726
|
|
| 30.12.2020, 08:14 | |
|
Под fDerivative() должен подводиться не выход, а вход. Так: fDerivative(вход)
0
|
|
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
|
| 30.12.2020, 09:28 [ТС] | |
|
Mikhaylo, а там разве не функция производной сигмоиды? У меня получается на выход идет активация нейрона (функция сигмоиды), а fDerivative(x) возвращает только число x*(1-x). Или вход это не сумма произведений выходов предыдущего слоя на веса, просто тогда я не знаю, как правильно задать обработку функции fDerivative(x)?
0
|
|
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
||||||
| 30.12.2020, 09:51 [ТС] | ||||||
|
Сделал некоторые исправления в коде по замечаниям, еще 1 ошибку в выборке у себя нашел, проверочная выборка неправильная была подставлена, и считалось в 2 раза меньше примеров. Главная странность в том, что выходной вектор результатов работы нейросети в среднем звене получается полностью без единиц (ну или изредка они бывают). И если подставить везде, где 3 выхода выдали 0 во второй элемент единицу, то результаты получаются близкие к идеальным. Но это какой-то странный костыль получается, так сеть не должна работать, какую-то ошибку я делаю.
Вывод после прохождения обучения, последний вектор активаций нейронов выходного слоя: Обновленный код:
0
|
||||||
|
698 / 574 / 75
Регистрация: 20.09.2014
Сообщений: 3,726
|
|
| 30.12.2020, 09:57 | |
|
В fDerivative() подставлять не выход активационной функции, а вход. Посмотрите в интернете математические выкладки, в результате которых появляется эта fDerivative().
0
|
|
|
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 37
|
|
| 30.12.2020, 10:08 [ТС] | |
|
Ну правильно - получается это моя функция fNet(), которая суммирует произведения каждого выхода нейрона предыдущего слоя на вес связи между ним и нейроном текущего слоя, для которого сумма и находится. Я ее как раз в коде так и переписал по вашему совету
0
|
|
|
698 / 574 / 75
Регистрация: 20.09.2014
Сообщений: 3,726
|
|
| 31.12.2020, 08:44 | |
|
Отследите вычисления вручную: считать не надо, просто проконтролируйте знак ошибки и сравните со знаками коррекции (отрицательное, положительное, ноль).
0
|
|
| 31.12.2020, 08:44 | |
|
Помогаю со студенческими работами здесь
13
Нюансы обучения нейросети Скорость нейросети и её обучения
Задача реализации обучения нейросети без учителя Поясните код нейросети на основе обучения с подкреплением Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|