Нейронная сеть без фреймворков глубокого обучения. |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-12-23 07:35 Я полностью закончил написание своего второго тестового задания. Само задание можно найти тут. Получился некий свой фреймворк, который можно дописать, включив новые функции активаций, функции потерь, новые типы слоев(свёрточный, к примеру). Ссылка на ноутбук с решением. Профессионал от дилетанта отличается познанием деталей. Так приступим же к ним :) Часть кода с функциями активаций, их производными весьма понятна. Остановлюсь лишь на функции потерь. В моем решении — это CrossEntropyLoss, как и в реализации pytorch, но лишь с одним исключением. В реализации на pytorch — функция применяет softmax на выходной слой в неявном виде, в моей же реализации — я явно применяю softmax к выходному слою. Параметр класс может выступать в качестве one hot encoded вектора. Насчет класса Layer — его объекты мы будем создавать при инициализации класса Network исходя из тех параметров, что задаст пользователь. Ну и тот самый класс нейронной сети — Network. Про параметры модели написано в самом ноутбуке. Если нужны математические обоснования работы всех формул, то напишите в комментариях — я отвечу :) 1 — мы идем от входа к выходу(матричные умножения). Сначала то, что входит(картинка 28*28 пикселей = 784 нейрона во входном слое), это умножается на матрицу весов ? получается новый слой с неким кол-вом нейронов и так далее. Это называют forward pass'ом. 2 — считаем ошибку на батче. 3 — теперь нам нужно обновить все веса нашей нейронной сети для того, чтобы минимизировать эту ошибку(функцию, зависящую от весов сети). Для этого есть универсальная формула: w_i = w_i — lr * d(L)/d(w_i). И тут понятно, что веса находятся между разными слоями ? имеют разные частные производные по функции ошибок. Для того, чтобы обобщить эту формулу мы и делаем 4-й шаг. 4 — backward pass. Идем от выходов ко входу, распространяя ошибку сети, параллельно вычисляя производные на каждом слое(потому что частная производная для весов, находящихся до i-го слоя, зависит от i-го слоя. График loss'а на обучающей выборке весьма ясно показывает тот факт, что значение функции потерь уменьшалось до какого-то момента, чего мы и добивались. График loss'а на тестовой выборке показывает, что значения функции потерь находились в том же диапазоне, что и значения функции потерь в конце обучения. Confusion matrix позволяет определить проблемные места в работе нейросети(например, показать какие цифры от каких она отличает хуже всего). Более подробно и наглядно — в ноутбуке. Метрика accuracy использована, так как классы распределены равномерно на тестовой выборке(в чём можно весьма просто убедиться, пробежавшись по меткам тестовой выборки). Если остались какие-то вопросы, то задавайте в комментариях — постараюсь ответить на все :) Источник: m.vk.com Комментарии: |
|