|
0 / 0 / 0
Регистрация: 16.02.2025
Сообщений: 14
|
||||||
Простая нейронка11.01.2026, 10:56. Показов 732. Ответов 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-ы. |
|
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
|
||
| 11.01.2026, 11:01 | ||
|
0
|
||
|
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,375
|
||||
| 11.01.2026, 15:34 | ||||
|
Привычно наблюдаю в коде одно лишнее умножение при каждой модификации веса/смещения. А ведь всем должны были в средних классах на алгебре вдолбить в башку экономящий вычисления приём вынесения общего множителя за скобки (в данном же случае будет не "за скобки" - а вообще за пределы сетки). После этого вряд ли можно утверждать, что писателями/читателями были/будут правильно освоены-поняты более поздние темы. Такие, как цепное правило дифференцирования сложных функций (а бэкпроп - это оно и есть) и - это уже будут ВУЗовские темы - градиентная оптимизация / стохастическая аппроксимация (тот или иной способ коррекции весов на основе вектора производных, вычисленного бэкпропом - это имено град.оптимизация либо стох.аппроксимация). ![]() Ну да, для того, чтобы запомнить "разметку" вершин 4мерного гиперкуба - надо обучать нейронку, да ещё и рисковать, что она не обучится (из-за неверной структуры, неверных настроек, ошибок в коде,...). В общем, нейронки на основе бэкпропа - они совсем для другого. Они для решения тех задач обучения с учителем, которые решает статистика (для аппроксимации поведения оптимального байесовского решателя в задаче классификации с учителем и для аппроксимации условного матожидания в задаче нелинейной регрессии). Также эти нейронки, при необходимости, позволяют догружать задачу любыми гладкими (точнее, хотя-бы однократно или, очень редко, двукратно непрерывно дифференцируемыми) добавочными условиями/ограничениями (штрафными слагаемыми в функции потерь, налагаемыми на нежелательные свойства решения="на нежелательное поведение нейронки" и/или на внутренние свойства модели). А для полностью детерминированных задач отображения "ключей" (входов) на "значения" (выходы) - у минимально умеющих в STL плюсовиков есть std::map и/или std::unordered_map. Имеются в виду те задачи, для которых сложно создать идеальный хэш. В данной же учебной задаче - идеальный хэш очевиден (4битовое значение и является этим самым оптимальным/идеальным хэшем, позволяющим получать соответствующее ключу значение вообще без проверок, прямым доступом к элементу массива по индексу). Ну а тот, кто зачем-то представляет 4битовое целое число набором из 4рёх флоатов - ССЗБ и, наверное, действительно без костыля из внешней нейронки не справится.
0
|
||||
|
wound up as Aussie
462 / 114 / 20
Регистрация: 15.05.2019
Сообщений: 453
|
|||||||
| 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
|
||
|
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,375
|
|||
| 11.01.2026, 20:04 | |||
* learning_rate или learning_rate*, в зависимости от места в коде.Это можно вынести вне сетки, после вычисления производных функции потерь по выходам сети. Т.е. вставить в строку 149. Можно и в строку 147 - но таки надо отделять момент вычисления производной функции потерь (которая может быть не только в виде MSE) от "границ" самОй сетки и "границ" метода обучения (в данном случае - метод обучения устанавливает для всех весов/смещений одну и ту же скорость обучения - и, поэтому, внутрь сетки либо к вектору производных ему лезть совсем не нужно). Т.е. уровень владения предметом я увидел - и дальше мне не интересно.
0
|
|||
|
wound up as Aussie
462 / 114 / 20
Регистрация: 15.05.2019
Сообщений: 453
|
|||||||
| 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
Простая игра Помогите! нужна простая программа Простая задачка Работа с файлами,простая БД
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|