Я Никита, мне 17 лет. Увлекаюсь программированием, графическим дизайном, анимацией, 3Д моделированием и рендером. Пишу на языках Си и Ассемблере. Здесь я буду выкладывать самые интересные вещи, которыми я хочу поделится, и снимать видео на темы программирования, и науки. Подпишись если тебе интересен такой контент, мне будет очень приятно :з
Информацией о выходе новых роликов, интересными моментами, и всем-всем-всем делюсь в своём телеграмм канале
Решил что то менять в жизни, спасибо большое за подробное видео пока у меня не хватает навыков что бы понять все, буду смотреть все твои видео может получится реально стать программистом, лайк подписка. Спасибо
Я совсем новичок в программировании.Подскажите, пожалуйста ! Почему, когда полностью скопировал код на Github и вставил в паскаль, то выдаёт ошибку в самой первой строке?
В программе есть существенная ошибка: при приведении указателя к double. От этого значение памяти по указателю не приводится к даблу, оно остаётся таким же как было, а у дабла совершенно другой формат! И соответственно на вход функции RightProt поступают совершенно некорректные значения. Приводить к даблу надо значения, а не указатель.
для лисы, волка, медведя перцептрон наверно не сможет работать, ведь для угадывания животного должно быть много признаков, а перцептрон вроде только к бинарной классификации относится
10-я строчка кода: return (a <= 0)? 0: 1; то же самое можно сделать куда проще: return a > 0; 20-я строка кода, вернее вся функция train. int* привести к double * - это, конечно, сильно (я уж молчу про небезопасно), не проще ли тогда изначально объявить массив data как double? Ну это же удобнее. Т.е. просто объявляем нашу функцию void train(double data[4][3], int exp[4), и в main'e объявляем double trainingdata[4][3], и все, и не нужно есть кактус. 33-я строчка: int expresults[4] = {0, 0, 1}; - это тоже сильно. к тому же, вроде как у нас была таблица 1,0,1 = 1 0,0,1 = 0 1,1,1 = 1 1,0,0 = 1 0,1,0 = 0 а в итоге мы почему-то используем таблицу 0,0,1 = 0 0,1,1 = 0 1,0,1 = 1 0,1,0 = ? (0 по дефолту, но это не точно) да, у нас массив из 4 элементов инициируется только 3-мя значениями, так что на месте последнего элемента у нас по чистой случайности правильный 0, просто повезло, так что берем и смело переписываем: double trainingdata[4][3] = { {1,0,1}, {0,0,1}, {1,1,1}, {1,0,0} }; int i, expresults[4] = {1,0,1,1}; /* .... */ double newdata[] = {1,1,0}; И, кстати, да, а для чего у нас тут windows.h? Мы ничего из него не используем, но зачем-то инклудим. Зачем? З.Ы. fmod( rand()%100000000 * 0.1, 1.05 ) ... ну-у-у-у.... ээ-это-о-о-о... а не проще ли w[i] = rand() % 11 / 10.0; Не? Никак? Низя? Работать не будет? Точно? Да и в целом, у нас на входе 3 животинки, а на выходе только 2 (либо 0, либо 1). Эх, жизнь не справедлива. Кто-то определенно не дополз до финиша. Либо задача составлена некорректно. В общем, еще есть куда расти. Успехов. :)
Почему у тебя все веса слоев обучаются на ошибке выходного? Разве не нужно найти ошибку каждого слоя, что собственно и является самой сложной формулой в backproportion
Боже мой, парень, ты просто невероятно хорош! Когда смотришь твои видео, понимаешь что нет ничего невозможного) Спасибо тебе огромное и удачи в развитии канала🔥
Скажем так. Реализация и идея хрень. НО! Интеллект - это способность решать не стандартные задачи нестандартно... Мне кажется ты доказал что будь у тебя достаточно времени и знаний ты бы написал намного лучше. Продолжай )
3:34 ошибка 0.33 * 0.1 = 0.033 Нейросети до сих пор косячат с математикой и простыми арифметическими действиями. Можно сказать что они не "думают", а очень профессионально "перемешивают" информацию и "галлюцинируют" ответы по заданным алгоритмам. Высококачественная электронная шизофазия получается ) "Это, так сказать, система… эээ… в составе 120 единиц. Фотографируете Мурманский полуостров и получаете te-le-fun-ken. И бухгалтер работает по другой линии - по линии библиотекаря. Потому что не воздух будет, академик будет! Ну, берем телевизор, вставляем в Мурманский полуостров, накручиваем там… эээ… все время черный хлеб… Так что же, будет Муромец, что ли, вырастать? Илья Муромец, что ли, будет вырастать из этого?"
неправильное понимание математической составляющей обратного распространения ошибки(( - это будет работать, но не оптимально - надо почитать серьезную литературу по нейронным сетям. дельта W = скорость обучения*градиент ошибки*выход предыдущего слоя. Градиент ошибки = -(ожидаемый-рассчитанный)*производная функции активации выходного сигнала.
Блин, обожаю эту забавно сложившуюся ситуацию на медиапространстве ютуб в сегменте "ответы на конкретные вопросы, на которые никто не знает ответа". Когда ты уже отчаялся искать решение сам, а никто из профильных специалистов тебе так и не смогу помоч, приходится лезть с запросом в самые далекие и неизведанные живимы людьми уголки, авторы которых, RU-vid, вероятно, даже не учитвает при построении алгоритмов, так как не видел ни разу хотя бы одну посторнюю куку на их канале, но ты в свое удивление имеено там находишь четкий ответ на свой вопрос, который неделями не мог услышать от неплохо шарящего себя и нескольких "высокоКПДшных мудрецов", получающих за такое деньги. И вот будто этого было мало, эксперт на видео не выговаривает букву "Р", но уже может пояснить за отпай серверного моста без критического перегрева узлов питания, из-за чего плата не получает нагрузки для отвала, но нещадно забаговывает все цепочки питания и вызывает периодический аварийный сброс питания в системе датчиков процессора. Понять это можно было только после окончательного отвала моста вместе со всеми его участниками, вызвавшего замыкание на остальных шинах, где скачком питания были трагически унесены жизни остального оборудования и даже мышки! Ситуация абсолютно незаурядная и редко встречающаяся, но гуру из начальный шкоклы уже шарил, что за проблема может быть при определенных симптомах. Не удивлюсь, если знание он получил эмпирическим путем, потому что гнал по взломанной шине древнюю видюху, малеха крутанув вольтаж за пределы допустимых значений цепочек подачи энергии. Именно тогда я понял, что нужно сразу идти копаться в дебрях ютуба, чтобы не тратить время на бесполезных водолеев, а сразу внимать Гуру. И вот уж так выходит, что кажлый такой самый полезный видос за последний лет 10 я в 95% случаев смотрел в шакальном разрешении под еле разборчивый голос автора, которого вопреки предположению из первого тезиса, не понятно не из-за качества видео, а из-за еще не умеющего полностью владеть речью ребенка)))))) К чему это я Хоть этот ролик к не относится к вышеизложенным примерам, но совсем юный возраст автора в пересечением с развитием цепочки событий, из-за которых я здесь это пишу, вызвали аналогичные эмоции и напомнили о тех самых приятно удивляющих минутах откровенного диссонанса сложности раскрываемого вопроса в сравнении с простой понимания темы на выходе с просмотра (сейчас я как раз искал видео на русском языке по новому обсеваемому софту, и не найдя ничего в РУ сегменте, кликнул на превью ролика по нейросетям, идея освоить написание которые в рамках оптимизации экселя никак не могла оставить мою голову в покое. Ну и, судя по всему, момент настал))))))))))))))))) Если зайдет конктент, уверен, что зарашу канал за пару недель
6:31 - всё немного не так. Допустим у нас есть лыжник, он упал на гору, ему нужно спуститься в самый низ. горы имеют локальный и глобальный минимум. В его распоряжении есть джетпак, который ускоряет его движение на константу LR, что позволяет проезжать локальные минимумы и даёт шанс попасть в САМУЮ низкую точку. Но мы не знаем, где будет такая точка и какое ускорение нам потребуется для её достижения, поэтому скорость обучения надо подбирать.
Ну я так и не понял, как с помощью весов это работает. Ну вот есть веса, они чё-то там подкручиваются влияют на решение. Как с помощью этих весов нейросеть может делать сложные действия, например генерировать видео, если даже близкого нету в датасете. Откуда эти веса знают, что человек носит очки на носу, а наушники в ушах, и генерируют видео правильно(ну почти), если никакие предпосылки этому не закладывались? Я сколько бы не пытался изучать структуру нейросетей, не понимаю, как в трезвом уме можно было такое придумать и как оно вообще заработало. Я уверен, что можно упростить структуру нейросетей, но не понимаю, как
Я вас понял. Я раньше начал изучать нейронные сети после того, как заинтересовался Stable Diffusion. В данном видео показан Перцептрон - архитектура используемая для классификации. Генеративные модели имеют другую архитектуру. Например, свёрточные нейронные сети (CNN) или рекурентные нейронные сети (RNN). Есть ещё генеративно состязательные сети (GAN). Для генерации изображений и видео вам не подходит архитектура перцептрона. Диффузионные модели обучаются на паре "изображение" + "текстовое описание". Для этого требуются большие датасеты и вычислительные мощности.
Нейронка работает криво, скопировала код и теперь почти во всех возможных вариантах выдает 1.0, у вас есть ошибка в весах нейронки, её один из весов значиться как 5.77316е-14 при значении максимум 2 и минимум -2 это слишком много. Поставьте вместо 1.05 на 1 множитель в создании весов, там куча всякого растроена даже
А во входе может быть также число от 0 до 1? Попробовал набор данных int[][] trainInput = new int[][] { new int[] { 5, 0, 1 }, new int[] { 5, 1, 1 }, new int[] { 0, 0, 1 }, new int[] { 5, 1, 0 }, }; int[] trainOutput = new int[] {0, 0, 1, 0}; при попытке получить ответ от { 5, 0, 1 } получаю 1, при попытке получить ответ от { 0, 0, 1 } получаю 1, при попытке получить ответ от { 5, 1, 1 } получаю 1,
Привет, Никита. Только сегодня наткнулся на твой канал. Отличный контент! Особенно в сравнении с контентом других блогеров твоего возраста здесь на ютубе. Круто, что ты разобрался в такой достаточно непростой теме и помогаешь разобраться другим - open source ждет тебя с распростертыми объятиями )) . Я вспоминаю, что мои программы в твоем возрасте были гораздо проще. Что касается приведенного тобой примера, то в строке 26, мне кажется, есть ошибка, связанная с приведением типа, когда ты передаешь массив в функцию RightProp. Приведение из int в double работает для отдельных значений, но не для векторов/указателей в том виде, в котором ты пытаешься его использовать. Чтобы убедиться в этом, выведи в твоем цикле функции RightProp значения inputs[i]: printf("%f ", inputs[i]); Сдается мне, там будут не совсем те значения, которыми ты проинициализировал trainingdata[ ][ ]. )) Быстрым фиксом было бы использование одного и того же типа для твоих массивов данных и аргумента функции RightProp(): либо везде int, либо везде double. Ну, и небольшая рекомендация. Вряд ли ты используешь древнюю С89 версию языка С. Поэтому нет никакой необходимости объявлять переменные в начале функций, особенно переменные цикла. Я понимаю, от наследия паскаля сложно избавиться сразу )), но for (int i =... делает код более читаемым. Удачи!