|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
Двухслойный персептрон, алгоритм BP. Не обучается, запоминает только последний заученный образ21.01.2013, 14:18. Показов 13890. Ответов 43
Метки нет (Все метки)
Доброго времени суток.
Для моей научной работы мне понадобился двухслойный персптрон (вместо реализованного однослойного). Алгоритм обучения использовал - BP (алгоритм обратного распространения ошибки). Параметры ИНС: Входной слой - 1000000 нейронов (50 изображений, 100х200 pix - зачем - не спрашивать), скрытый слой - 100 нейронов, выходной - 15 нейронов. Активационная функция - сигмоид (1/(1+Exp(-Alpha*x)). Проблема следующая: персептрон, после обучения, независимо от поданного образа выдает 1 только на том нейроне который был обучен последним. Другими словами - он запоминает только последний образ, а остальные забывает. Пробовал менять v (скорость обучения), количество нейронов, случайные величины начальных весов и т.д. - одинакого. Приложил класс с этим персептроном во вложении. (вложить нет прав пока). http://zalil.ru/34189242 Перевел на C# пример, который предложили здесь Многослойный перспетрон в 6-ом посте. вот собрал работающий проект: http://zalil.ru/34189254 Тот же самый глюк. В чем косяк? поставьте на путь истинный)
0
|
|
| 21.01.2013, 14:18 | |
|
Ответы с готовыми решениями:
43
Не запоминает линии, а только текст Массив $url[0] запоминает только один символ Нейронные сети "Многослойный персептрон и алгоритм обратного распространения ошибки" |
|
I ♥ C#
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
|
||
| 25.01.2013, 20:32 | ||
|
Очевидно вы это и так знаете, но оставлю ссылку на принципы тренировки многослойной нейронной сети с обратным распространением ошибок для тех, кто рискнет разобраться в вашем проекте.
0
|
||
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
||
| 26.01.2013, 22:22 | ||
|
Сама же проблема решается просто. Но - долго ![]() Оптимальному размеру соответствует минимум ошибки обобщения или момент выхода этой ошибки на асимптоту. Т.е. строим график зависимости точности обобщения (ну и график зависимости точности обучения - тоже можно) от размера сети - и смотрим на поведение кривой. Если обучающая и тестовая выборки репрезентативны со статистической точки зрения - поведения кривых (кривых ошибок обучения и обобщения) будут достаточно гладкими и экстремумы и выходы на асимптоты можно будет легко увидеть глазами. Да - точности меряются на последней эпохе обучения. Т.е. это не изменение точностей в ходе обучения - а сравнение точностей обученных сетей разного размера.
0
|
||
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 27.01.2013, 11:41 [ТС] | |
|
Да я знаю)
Я просто с одной стороны ограничен временем - каждый опыт у меня считается долго, уже сутки тестирую разные примеры. успешно кстати). А с другой стороны ограничен памятью - у меня веса, при таких количествах занимают сотни мегабайт, и увеличивать их бесконечно некак. Щас хочу еще увеличить скорость, попробовать RProp реализовать. Вроде уже и рассчитал формулы для расчета величин коррекции , а потом заметил, что там обучения не по эпохам проходит, а после предъявления всех образов (пакетный режим).. так что и формулы там похоже другие будут, т.к. сигнал ошибки по другому рассчитывается. И кода понятного нигде нет. З.Ы. Линк на RProp
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 29.01.2013, 14:44 [ТС] | |
|
Давно уже собирался скинуть новый вариант своей тестовой нейронной сети с гиперболическим тангенсом.
Основные изменяемые параметры: m0,m1,m2 - Число нейронов на первом(входном) / втором / выходном слоях. Стоит 40000 / 100 / 15. TeachNum = 2; - Количество примеров которым учится персептрон (для каждого примера по одному выходному нейрону), должен быть меньше или равен m2. IterationNum = 100; - Количество итераций обучения - сколько раз будут поданы обучающие примеры на персептрон. При данных параметрах персептрон за 100 итераций успевает сойтись практически всегда. У меня фиксирована, и нормального критерия останова нет. MaxInitWeights = 0.00005f; - величина, 0 < x < 0.00005, которой будут случайно проинициализированы веса в начале обучения. Рассчитывается так: (1/2) * m0 * (MaxInitweights / 2) = 0.5. Здесь 0.5 - это подходящий участок на гиперболической сигмоиде. Для m0= 40000; равен MaxInitWeights = 0.00005f; Для m0= 100000; равен MaxInitWeights = 0.00002f; Для m0= 200000; равен MaxInitWeights = 0.00001f; Для остальных, посчитайте сами. nu = 0.001f; - Коэффициент скорости обучения - очень геморройная вещь, будет слишком большой - веса заполнятся неведомо большой херней, и не сойдется никогда. А если будет слишком маленькой - будет сходится ооооочень долго. Выбирается почти эмпирически. Для m0= 40000; равен nu = 0.003f; Для m0= 200000; равен nu = 0.001f; (НЕ ФАКТ, тестирую пока что) Для m0= 1000; равен nu = 0.01f; - А можно и больше, сходится очень легко. Параметры a_tanh и b_tanh использованы стандартные, и менять их незачем. alpha = 0.5 - коэффициент инерционности. Нужен, чтобы хоть как то ускорить обучение. 0.5 вроде оптимальный. В коде дофига комментов, что непонятно, можно узнать в учебнике Хайкина. Функции обучения обычной сигмоиды я не убирал, но они там не используются. Режим обучения - последовательный. Работа с тестовой программой: жмем кнопку обучить... ждем когда номер итерации доберется до IterationNum, персептрон обучен. Выбираем распознаваемый образ, жмем тест, и если всё сошлось то i-го образа на i-ом нейроне должно быть что то приближающееся к 1, а на остальных - близкое к минус 1. Держите
4
|
|
|
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
|
|
| 29.01.2013, 14:46 | |
|
Чувствую, это мне скоро очень поможет.
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 29.01.2013, 14:49 [ТС] | |
|
Я на нём тестирую выбор всех этих параметров, чтобы потом их у себя использовать.
RProp я почти понял как сделать, но мне пока влом ![]() Не по теме: Седня поставил свой персептрон ночью учится. Утром встал, жду 5000-ую итерацию... и тут по клаве пробегает КОТ и всё сбрасывает в ноль!!! Обидно)
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 17.02.2013, 12:40 [ТС] | |
|
Уважаемые форумчане!
Я в данных момент занят созданием сверточной нейронной сети. По этой, относительно новой сети имеется литература (даже на русском языке) и статьи по успешной реализации. И есть несколько вариантов готового кода на С++. Но мне этот код не дал почти ничего - проще написать свой, чем разбираться в чужом коде. Я думаю свой код выложить, если доделаю, и у меня появился следующий вопрос: насколько Вам понятен тот код, который я выложил? Конструктивная критика приветствуется Для понимания кода общее представление о нейросетях обязательно.
0
|
|
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
|
| 23.02.2013, 21:43 | |
|
RABBITSV,
![]() Да какая она относительно новая... Ей 25 лет в обед (первый вариант у ЛеКуна был в 88 или 89 году) - это если не вспоминать её прямых предков (когнитрон и неокогнитрон). А если по существу вопроса... Не глядел Ваш код (пишу на С/С++/Асм, а не на шарпе). Я свёрточную нейросетку делал - мой финальный код отличается от начального как небо от земли. Из-за того, что я провёл несколько итераций оптимизации (вплоть до использования инлайн-ассемблера для реализации многих расчётных функций). Так что всё от Вас зависит - поставите ли во главу угла скорость или наглядность кода.
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 24.02.2013, 09:52 [ТС] | |
|
Да вот во многих реализациях я видел использование массива связей вида (i, w, j) - i-координаты нейрона начала связи, w - индекс веса (элемента ядра), j - координаты нейрона конца связи.
С ними работать удобно конечно - не нужно их каждый раз их рассчитывать, но памяти этот массив жрёт мнооого. Решил сделать без него, то есть каждый раз связи рассчитывать и проходить - слишком медленно работает. Так что массив связей оставлю. Внимание Терзает меня один вопрос: у меня на вход этой сети должно подаваться не одно изображение 100х200, а 10 или 30 одновременно. Вот думаю, как поступить. Вариант 1: Соединить изображения в одно, стык-в-стык, и подать на вход сети изображение 500 х 400. Вариант 2: Сделать на входном слое не одно изображение, а 10 (10 карт признаков 100х200). Второй вариант предпочтительней, т.к. размеры всех карт меньше 255х255 и в массиве связей можно использовать переменные типа byte (8 бит). Но, вот только, будет ли он работать так же хорошо?
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 16.06.2013, 13:03 [ТС] | |
|
Извиняюсь, что апаю старую тему, но это замечание очень важное:
По поводу расчета количества нейронов в скрытых слоях есть замечательнейшее следствие из теорем Арнольда – Колмогорова – Хехт-Нильсена (те самые теоремы, которые доказывают представляемость Любой сколь угодно сложной функции в виде двухслойного персептрона). Эта формула опубликована в учебнике Ясницкого (лежит вот здесь). Вводите в ту формулу количество входных и выходных нейронов, а так же количество образов, которые ИНС должна запомнить - и вы получите количество (промежуток значений) необходимых связей между нейронами. Там даже есть формула для того чтобы узнать количество нейронов во внутреннем слое, по количеству связей, для двухслойного персептрона. Для трехслойного (и выше) персептрона расчитать количество связей нетрудно - сумма произведений количеств нейронов соседних слоёв. З.Ы. Почему всё это написал? Допустим есть двухслойный персептрон - на входе 120, на выходе - 5 нейронов. В обучающей выборке - 100 образов. Так вот, если тупить - то можно долго подбирать количество нейронов на внутреннем слое - 30.. 50.. 100.. 200... 1000... - персептрон хоть и обучиться, но будет это делать ОООЧЕНЬ долго. А если воспользоваться формулой, то сразу получим 9 нейронов - и с ними всё у нас будет чики-пуки. З.Ы.Ы. За достоверность представленных здесь сведений ответственности не несу, так как нейронные сети слишком мало изученная область, и ничего нельзя сказать наверняка.
0
|
|
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
|
| 16.06.2013, 19:56 | |
|
Поверьте человеку, который про нейросети впервые услышал 20 лет назад и с тех пор с ними не расстаётся.
Так вот, все формулы оценки числа скрытых нейронов в многослойном персептроне должны быть отправлены в топку, как полный мастдай. Ибо они оценивают погоду на луне. Доказательство очевидное. Удваиваем число примеров в выборке (дублируем каждый пример), утраиваем и т.д. - каждый раз оценка числа нейронов будет изменяться, хотя сложность задачи не поменялась. Удваиваем (утраиваем и т.д.) число входов, делая добавленные входы константными - каждый раз оценка числа нейронов будет изменяться, хотя сложность задачи не поменялась. Т.е. теоремы не оценивают никаких связей между зависимыми и независимыми признаками вообще. Про неучёт особенностей используемой целевой функции (которая говорит, как будут штрафоваться ошибки сети) я и не говорю. Так что обучайте кучу сеток с разным числом нейронов, стройте по результатам learning curves, и на этих кривых находите экстремумы и/или выходы на асимптоту точности. Вот эти переломные точки и будут указывать на оптимальный размер. Ссылку на страницу своего сайта (где есть идеализированные картинки и ссылки на мои и чужие статьи с реальными картинками кривых обучения) я на форуме вроде бы давал - http://neuropro.ru/memo12.shtml
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 16.06.2013, 20:04 [ТС] | |
|
Да я в курсе... поэтому и написал з.ы.ы.
На эту же тему есть мера Вапника-Червоненкиса. Ну а так, да, всё эмпирически, к сожалению, отчасти с вами согласен. Касаемо этого: "Удваиваем число примеров в выборке, утраиваем и т.д. - каждый раз оценка числа нейронов будет изменяться" можно сказать, что в теореме (возможно) имеются ввиду все образы уникальные. Просто большие нейронные сети имеют нехорошее свойство обучаться очень долго, и делать многочисленные тесты бывает очень затратно.
0
|
|
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 19.06.2013, 18:15 [ТС] | |
|
VTsaregorodtsev,
У Вас есть какие нибудь эмпирические данные о количестве слоев на скрытом слое для данной нейронной сети: Основные параметры: Тип: двухслойный персептрон (1 скрытый слой, полносвязный) Входной слой: 120 нейронов Выходной слой: 53 нейрона Количество образов в выборке: 25000 - 30000 штук. (для теста хотя бы 1000, 5000). Функция активации: tanh (a_tanh = 1.7159; b_tanh = 2/3; ) Сейчас вот тестирую разный конфигурации, выборка из 10 образов очень легко сходится и с 50 нейронами, со 100 - со скрипом при 98 нейронах. Для 1000 - еще не успел найти варианта.
0
|
|
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
|||
| 19.06.2013, 23:01 | |||
|
Уникальные образы - это обычно разные тестовые или ублюдочные задачи типа xor, к нейросетям притянутые за уши. Ну и сами посчитаете число синапсов в Вашей сети и вот этом моём примере: задача MNIST распознавания начертаний рукописных цифр, 60000 обучающих образов, размер картинки 28*28 (т.е 784 признака на входе), 50 скрытых нейронов, 10 выходных. У меня эта сетка на процессоре шестилетней давности с тактовой 2.13ГГц обучается (50 эпох обучения) за 2мин10сек процессорного времени. Может, Вам стоит заняться оптимизацией программы? Правда, задачка MNIST всё же достаточно хорошая - там классы достаточно хорошо расположены в многомерном пиксельном признаковом пространстве (отдельные классы очень хорошо отделяются от других, что снижает общую сложность задачи).
0
|
|||
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 20.06.2013, 02:00 [ТС] | |
|
Неуникальные образы, независимые признаки - это всё конечно хорошо, и на практике всё это может быть. Но формула математическая, а не эмпирическая, да и теорема, из которой она следует, доказывает только разложимость любой функции на сумму других. А всё что вы говорите - это бесконечное множество примечаний к этому следствию, например, что мол если вот эти переменные - константы, то формула меняется так-то. Но всего и не предусмотришь в двух коротких формулах.
И у меня как никак, после ряда тестов, оказалось что в скрытом слое должно быть 40 нейронов, т.е. среднее число из промежутка, что мне дала формула - [5; 98]. Но спорить об этом не стоит, это нейронные сети ![]() ---------------------------------------------------------- У меня, в данном случае, не задача распознавания образов (хотя ими я больше занимаюсь), а другая, у меня 2 образа из одного класса могут очень сильно отличаться. Сначала у меня как раз и было 5 классов, но я подумал и разделил их на подклассы, чтобы на каждый класс приходилось поменьше разных вариантов. Да и в применении оно удобнее. Ммм... "60000 обучающих образов" и "50 эпох обучения" - я так понял у Вас параллельный режим обучения? Просто я как правило занимаюсь последовательным обучением, и у меня соответственно для обучения сети с 40 нейронами (внутри), 100 образам - уходит 100 000 итераций (ну или 200 000, чтоб по самые уши - занимает где-то 2 минуты). Правда, если увеличивать кол-во нейронов и образов, то время возрастает значительно. Но чёто с параллельным обучением по эпохам у меня не повелось. А вот что надо точно - это параллельные вычисления - на CUDA, например. Это бы Значительно ускорило процесс.. Но всё никак руки не доходят до него.
0
|
|
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
||
| 23.06.2013, 17:16 | ||
|
Обучение по эпохам (по суммарному градиенту выборки) я тоже пробовал распараллеливать. Несколько лет назад. Но попримерное обучение для больших задач обычно сходится значительно быстрее.
0
|
||
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 23.06.2013, 17:25 [ТС] | |
|
Ну тоесть у вас получается 60000 * 50 эпох = 3000000 итераций, я так понял.
Да я просто всё никак не соберусь распараллелить, завтра защита диссера, а этот проект - другое направление. На CUDA можно всё это дело сделать очень быстрым. Щас вот пока делаю тесты, но я там не учитываю обобщение, сначала на 100 выборках, потом на 200, щас на 400. Сначала ставил, например 74 нейрона - делал 20 тестов, сколько за 40000 итераций правильно распознает, потом для 54 нейронов, для 94 нейронов, и находил подходящее количество. До 1000 выборок еще не дошёл.
0
|
|
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
||
| 23.06.2013, 17:54 | ||
|
0
|
||
|
142 / 16 / 2
Регистрация: 21.01.2013
Сообщений: 54
|
|
| 23.06.2013, 18:03 [ТС] | |
|
Тут еще есть небольшая проблема с переобучением сети, например:
При 100 выборках - после 200 000 - 500 000 итераций распознаёт 100 из 100; При 200 выборках - после 1 млн итераций распознаёт 190 - 200 из 200, а после 2 млн - 195 - 200 - то есть обучатся вроде как перестала уже, и может быть началось переобучение. У меня просто нет еще к сожалению там метода для определения обобщающей способности.
0
|
|
| 23.06.2013, 18:03 | |
|
Как запустить Windows с жесткого диска, если есть только её образ Почему при скачивании любой игры скачивается только образ диска?
Не могу записать двухслойный DVD. Отправляет только последний чекбокс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|