|
0 / 0 / 0
Регистрация: 16.02.2025
Сообщений: 14
|
||||||
Простая нейронка11.01.2026, 10:56. Показов 900. Ответов 8
Здравствуйте. Несколько лет назад я заинтересовался нейронными сетями. В те времена Chat GPT небыли такими «умными» и писать код еще не умели поэтому пришлось разыскивать подходящие материалы самому. В конце- концов мне удалось найти на сайте Back propagation - алгоритм обучения по методу обратного распространения | #3 нейросети на Python
видео (доступно на RuTube ) в котором достаточно просто объяснялось создание и работа простой нейросети размерностью 2-3-2-1. Используя этот урок и на основании того что мне удалось понять, я написал на с++ свою простую нейросеть 4-10-12-4 которая умеет (после обучения с «учителем») к четырехбитному двоичному числу в диапазоне от 0000 до 1111 прибавлять 1. Нейросеть при обучении использует мини-пакетный градиентный спуск с полным проходом по всем данным в каждой "эпохе". Происходит Online Learning - веса обновляются сразу после каждого примера, Так как материалов по самописным нейросетям мало даже сейчас, я решил выложить свое творение на всеобщее обозрение. Надеюсь, моя программа будет полезна ученикам средних школ и студентам непрофильных ВУЗов, интересующимися нейросетями. Конечно, в программе могут быть ошибки, если кто-то сможет подсказать что-то полезное, буду благодарен за помощь. Для наглядности при создании нейросети я использовал статически выделенные массивы в си стиле. У моей нейросети имеются следующие недоработки: 1. Она переобучена — при обучении на вход в 1 батче подается весь набор данных, причем один за другим. Для правильного обучения обучающие данные рекомендуется перемешивать в случайном порядке. 2. Нейросеть должна научиться находить паттерны. Для этого обычно при обучении на вход подается примерно 80% примеров. А оставшиеся 20% подают при тестировании. У меня же нейросеть «вызубривает» все 100% подаваемых примеров. 3. Обычно начальная инициализация весов сети происходит по определенным алгоритмам. У меня в программе начальные значения задаются конкретными литералами. С другой стороны, это дает новичкам возможность для творчества. Я специально снабдил программу многочисленными комментариями, чтобы ученику было проще понять, что и зачем происходит в данном коде. Когда результаты нейросети совпадают с ожидаемыми, говорят, что нейросеть сходится. Но не всегда результаты совпадают с нашими ожиданиями. Согласитесь, что нет необходимости добиваться на выходе именно 0 или 1. Достаточно, что бы результаты явно попадали в заданный диапазон. Например, вполне можно считать величину больше 0.9 единицей, а величину меньше 0.1 нулем. Определить это поможет специальная функция CompareBinaryResult( N_out, n_out, max0, min1) предназначенная для сравнения результатов. Если полученное число окажется вне нужного диапазона, вместо цифры будет выведен «?». Естественно, данная нейросеть вполне может научиться имитировать работу двух битного сумматора (микросхема К155ИМ2 (7482)). С уважением PavelT.
0
|
||||||
| 11.01.2026, 10:56 | |
|
Ответы с готовыми решениями:
8
Нейронка, складывающая два числа простая арифметика Простая задача на C++: поменять местами bool-ы. |
|
14299 / 9384 / 1353
Регистрация: 21.01.2016
Сообщений: 35,381
|
||
| 11.01.2026, 11:01 | ||
|
0
|
||
|
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,392
|
||||
| 11.01.2026, 15:34 | ||||
|
Привычно наблюдаю в коде одно лишнее умножение при каждой модификации веса/смещения. А ведь всем должны были в средних классах на алгебре вдолбить в башку экономящий вычисления приём вынесения общего множителя за скобки (в данном же случае будет не "за скобки" - а вообще за пределы сетки). После этого вряд ли можно утверждать, что писателями/читателями были/будут правильно освоены-поняты более поздние темы. Такие, как цепное правило дифференцирования сложных функций (а бэкпроп - это оно и есть) и - это уже будут ВУЗовские темы - градиентная оптимизация / стохастическая аппроксимация (тот или иной способ коррекции весов на основе вектора производных, вычисленного бэкпропом - это имено град.оптимизация либо стох.аппроксимация). ![]() Ну да, для того, чтобы запомнить "разметку" вершин 4мерного гиперкуба - надо обучать нейронку, да ещё и рисковать, что она не обучится (из-за неверной структуры, неверных настроек, ошибок в коде,...). В общем, нейронки на основе бэкпропа - они совсем для другого. Они для решения тех задач обучения с учителем, которые решает статистика (для аппроксимации поведения оптимального байесовского решателя в задаче классификации с учителем и для аппроксимации условного матожидания в задаче нелинейной регрессии). Также эти нейронки, при необходимости, позволяют догружать задачу любыми гладкими (точнее, хотя-бы однократно или, очень редко, двукратно непрерывно дифференцируемыми) добавочными условиями/ограничениями (штрафными слагаемыми в функции потерь, налагаемыми на нежелательные свойства решения="на нежелательное поведение нейронки" и/или на внутренние свойства модели). А для полностью детерминированных задач отображения "ключей" (входов) на "значения" (выходы) - у минимально умеющих в STL плюсовиков есть std::map и/или std::unordered_map. Имеются в виду те задачи, для которых сложно создать идеальный хэш. В данной же учебной задаче - идеальный хэш очевиден (4битовое значение и является этим самым оптимальным/идеальным хэшем, позволяющим получать соответствующее ключу значение вообще без проверок, прямым доступом к элементу массива по индексу). Ну а тот, кто зачем-то представляет 4битовое целое число набором из 4рёх флоатов - ССЗБ и, наверное, действительно без костыля из внешней нейронки не справится.
0
|
||||
|
wound up as Aussie
463 / 115 / 20
Регистрация: 15.05.2019
Сообщений: 455
|
|||||||
| 11.01.2026, 15:47 | |||||||
|
3) та просто random можно делать в этом случае. Это у Вас MLP и его лучше сделать бутылочного типа (у Вас сейчас "мяч для регби" скорее ))) - поднять число нейронов на внутренних слоях и выходов сделать 16. А если выходы переписать, то тогда получится "дешифратор" типа К155ИД3. )))
0
|
|||||||
|
0 / 0 / 0
Регистрация: 16.02.2025
Сообщений: 14
|
||
| 11.01.2026, 17:12 [ТС] | ||
0
|
||
|
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,392
|
|||
| 11.01.2026, 20:04 | |||
* learning_rate или learning_rate*, в зависимости от места в коде.Это можно вынести вне сетки, после вычисления производных функции потерь по выходам сети. Т.е. вставить в строку 149. Можно и в строку 147 - но таки надо отделять момент вычисления производной функции потерь (которая может быть не только в виде MSE) от "границ" самОй сетки и "границ" метода обучения (в данном случае - метод обучения устанавливает для всех весов/смещений одну и ту же скорость обучения - и, поэтому, внутрь сетки либо к вектору производных ему лезть совсем не нужно). Т.е. уровень владения предметом я увидел - и дальше мне не интересно.
0
|
|||
|
wound up as Aussie
463 / 115 / 20
Регистрация: 15.05.2019
Сообщений: 455
|
|||||||
| 12.01.2026, 03:01 | |||||||
Сообщение было отмечено vasya_sidorov_2 как решение
Решение
1
|
|||||||
|
0 / 0 / 0
Регистрация: 16.02.2025
Сообщений: 14
|
||
| 13.01.2026, 20:51 [ТС] | ||
Добавлено через 14 минут "А если выходы переписать, то тогда получится "дешифратор" типа К155ИД3. " Да, можно, только var_combInp будет для микросхемы равен 19 (возможным вариантам состояний), n_input=6, по количеству входных ножек, а n_out=16 вариантов по количеству выходных ног. Как -то так, если упрощенно
0
|
||
|
2 / 2 / 0
Регистрация: 04.07.2021
Сообщений: 101
|
|
| 04.02.2026, 10:53 | |
|
свой код это хорошо, значит вы разобрались в теме. но есть много библиотек сейчас, я например использую opennn, пока правда похвастаться нечем.
0
|
|
| 04.02.2026, 10:53 | |
|
Помогаю со студенческими работами здесь
9
Простая игра Помогите! нужна простая программа Простая задачка Работа с файлами,простая БД
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 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
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|