Скачать программы для построения нейронных сетей. Нейронные сети и мобильные приложения

01.06.2019

Я давно интересовался нейросетями, но только с позиции зрителя – следил за новыми возможностями, которые они дают по сравнению с обычным программированием. Но никогда не лез ни в теорию, ни в практику. И вдруг (после сенсационной новости о AlphaZero) мне захотелось сделать свою нейросеть. Посмотрев несколько уроков по этой теме на YouTube, я немного врубился в теорию и перешёл к практике. В итоге я сделал даже лучше, чем свою нейросеть. Получился конструктор нейросетей и наглядное пособие по ним (то есть можно смотреть, что творится внутри нейросети). Вот как это выглядит:

Как пользоваться конструктором

Для начала скачайте архив отсюда .

Распакуйте в корень диска D:\

Запустите NeuroNet.exe

Можете попробовать «Загрузить» какую-нибудь сеть, посмотреть на неё, нажать «Обучение», увидеть её точность, потыкать стрелки влево, вправо (по бокам), чтобы посмотреть различные варианты входных (левый столбец нейронов) и выходных (правый) данных, нажать «Стоп» и попробовать ввести свои входные данные (разрешены любые значения от 0 до 1, учитывайте это при создании своих сетей и нормализуйте входные и выходные данные).

Теперь как строить свои сети. Первым делом необходимо задать архитектуру сети (количество нейронов в каждом слое через запятую), нажать «Построить» (или сначала «Снести», затем построить, если у Вас на экране уже отображается другая сеть), нажать «Обучающая выборка», «Удалить всё» и ввести свои обучающие примеры, согласно инструкции на экране. Также можно указать на вход и на выход маленькие квадратные картинки (максимум 5х5 пикселей), из которых будут определены нормализованные значения яркости пикселей (не учитывая их цвет), для чего нужно нажать на «in» и «out» соответственно. Нажать «Добавить пример», повторить процедуру нужное количество раз. Нажать «Готово», «Обучение» и как точность станет удовлетворительной (обычно 98%), нажать «Стоп», иконку в виде дискеты (сохранить), дать сети имя и радоваться, что Вы сами создали нейросеть. Дополнительно можете устанавливать скорость обучения ползунком «Точнее/Быстрее», а также визуализировать не каждый 50й шаг, а каждый 10й или 300й, как Вам угодно.

Интеграция созданных сетей в свои проекты

Чтобы использовать свои нейросети в собственных проектах, я создал отдельное приложение doNet.exe , которое нужно запускать с параметрами: « D:\NeuroNet\doNet.exe <название сети> <входные данные через пробел> », дождаться завершения работы приложения, после чего считать выходные данные из D:\NeuroNet\temp.txt

Для примера создано приложение 4-5.exe, использующее сеть «4-5» (об этой и других сетях ниже). В этом приложении подробно расписано как правильно запускать doNet.exe

Разбор сетей, идущих в комплекте

Начнём с классики – «XOR(Полусумматор)». Среди прочих, в частности, эту задачу – сложение по модулю 2 – в 1969 году приводили в качестве примера ограниченности нейросетей (а именно однослойных перцептронов). В общем, имеется два входа (со значениями либо 0, либо 1 у каждого), наша же задача - ответить 1, если значения входов разные, 0 – если одинаковые.

Далее «Количество-единиц». Три входа (0 либо 1 на каждом). Требуется посчитать, сколько было подано единиц. Реализовано как задача классификации – четыре выхода на каждый вариант ответа (0,1,2,3 единицы). На каком выходе максимальное значение, соответственно таков и ответ.

«Умножение» – Два входа (вещественные от 0 до 1), на выход их произведение.

«4-5» – На вход подаются нормализованные значения яркости пикселей картинки 4х4, на выходе имеем нормализованные значения яркости пикселей картинки 5х5.

Сеть задумывалась, как увеличение качества большой картинки на 25%, вышел же интересный фильтр для фото:

UPD: В архив добавлено приложение NeuroNet2.exe (тот же конструктор, но без визуализации (благодаря чему работает в 2 раза быстрее) и ограничений на количество нейронов в слое (до 1024 вместо 30), также в обучающей выборке на вход и выход можно подавать квадратные картинки до 32х32). Также добавлен график обучения. Нейросетями теперь могут пользоваться (и встраивать в свои проекты (даже на сервере)) и те, кто не знает их теории! В полуавтоматическом режиме (после обучения вручную подавать на вход значения и получать результат на экране) их можно использовать даже без знания программирования!

Вот собственно и всё, жду комментариев.

P.S. Если вылезает ошибка, попробуйте зарегистрировать от администратора с помощью regsvr32 файлы comdlg32, которые также есть в архиве.

Конечно, Prisma уже далеко не единственные, и с тех пор у них появилось множество конкурентов. Facebook купили приложение MSQRD , которое добавляет анимированные «маски» к вашим видео. В отличие от Призмы здесь ставка сделана на распознавание лиц и наложение фильтров на них.

SwiftKey и другие клавиатуры

Большинство современных клавиатур для мобильников уже давно не используют пользовательские словари, такие как T9. Если вы набираете какую-то фразу, то наверняка здесь замешана нейросеть. Некоторые разработчики идут дальше. SwiftKey выпустили бета-версию клавиатуры, которая полностью основана на работе нейросети. Благодаря чему клавиатура не просто подставляет наиболее часто набираемые фразы, а основывается на контексте.

Новая технология пока доступна для ограниченного количества языков и находится на стадии бета-версии. Но и публичная версия SwiftKey основывается на Больших данных. Например, пользовательские словари доступны всем, кто установил клавиатуру. Конечно, за исключением персональных данных.

Snapchat и его фильтры - ещё одно из самых известных применений нейросетей. Если упростить сложное, то приложение использует компьютерное распознавание лиц для идентификации мимики и точек движения мускулов. А уже потом применяет к ним свои фильтры.

Shazam и SoundHound

Эти два популярных приложения распознают музыку, которая играет рядом с нами, а затем сверяет этот фрагмент со слепком в своей «библиотеке». Звучит достаточно просто, но для этого приложение использует нейросети. Здесь приходится решить несколько сложных задач, и даже ни сколько по поиску совпадений, а по очистке лишнего шума при распознавании.

Google Ассистент и Siri

Говорить только про Google Ассистент или Siri будет не совсем правильно. Представить современные сервисы Google и Apple невозможно без Big Data и нейросетей. Любая разработка от этих двух компаний, так или иначе, задействует нейросети. Автоподсказки при поиске, показ рекламы, очистка почты от спама и многое другое. И всё-таки самое явное для нас применение - это голосовые ассистенты. Смартфон распознаёт наш запрос и выполняет поставленную задачу в зависимости не только от контекста фразы, но и нашего местоположения.

Carat

Некоторые приложения, наоборот, нацелены на выполнение лишь одной задачи. Например, Carat на основе данных о вашем использовании смартфона (анализе расхода батареи) укажет на те приложения, которые больше всего расходуют заряд. Вы можете удалить или ограничить использование таких программ и помочь телефону «дожить» до розетки.

Netflix, YouTube, Apple и Google Музыка... Все эти сервисы предлагают музыку и видео на основе ваших предпочтений. За последние пару лет этот тренд пошёл немного дальше и теперь нам предлагаются целые смарт-листы, которые подойдут под наш род занятий или время дня.

Big Data и нейросети могут не только продавать нам рекламу, лечить наши болезни или управлять нашим разумом. Большинство разработок мы замечаем только тогда, когда они подаются нам в развлекательном формате или улучшают наши самые простые ежедневные задачи. Из-за чего мы часто забываем, что нейросеть - это не только моська котёнка у нас в телефоне.

Пример программы нейронной сети с исходным кодом на с++.

Про нейронные сети хорошо и подробно написано . Попытаемся разобраться как программировать нейронные сети, и как это работает . Одна из задач решаемых нейронными сетями, задача классификации. Программа демонстрирует работу нейронной сети классифицирующей цвет.

В компьютере принята трехкомпонентная модель представления цвета RGB , на каждый из компонентов отводится один байт. полный цвет представлен 24 битами, что дает 16 миллионов оттенков. Человек же может отнести любой из этих оттенков к одному из имеющих название цветов. Итак задача:

Дано InColor - цвет RGB (24 бит)

классифицировать цвет, т.е. отнести его к одному из цветов заданных множеством М ={ Черный, Красный, Зеленый, Желтый, Синий, Фиолетовый, Голубой, Белый } .

OutColor - цвет из множества М

Решение номер 1. (цифровое)

Создаем массив размером 16777216 элементов

Решение номер 2. (аналоговое)

напишем функцию, типа

Int8 GetColor(DWORD Color)
{
double Red = (double(((Color>>16)&0xFF)))/255*100;
double Green = (double(((Color>>8)&0xFF)))/255*100;
double Blue = (double((Color&0xFF)))/255*100;
double Level = Red;
if(Green > Level)
Level = Green;
if(Blue > Level)
Level = Blue;
Level = Level * 0.7;
int8 OutColor = 0;
if(Red > Level)
OutColor |= 1;
if(Green > Level)
OutColor |= 2;
if(Blue > Level)
OutColor |= 4;
return OutColor;
}

Это будет работать если задачу можно описать простыми уравнениями, а вот если функция настолько сложна что описанию. не поддается, здесь то на помощь приходят нейронные сети.

Решение номер 3. (нейронная сеть)

Простейшая нейронная сеть. Однослойный перцептрон.

Все нейронное заключено в класс CNeuroNet

Каждый нейрон имеет 3 входа, куда подаются интенсивности компонент цвета. (R,G, B) в диапазоне (0 - 1). Всего нейронов 8 , по количеству цветов в выходном множестве. В результате работы сети на выходе каждого нейрона формируется сигнал в диапазоне (0 - 1), который означает вероятность того что на входе этот цвет. Выбираем максимальный и получаем ответ.

Нейроны имеют сигмоидную функцию активации ActiveSigm() . Функция ActiveSigmPro() , производная от сигмоидной функции активации используется для обучения нейронной сетиметодом обратного распространения.

В первой строчке выведены интенсивности цветов. ниже таблица весовых коэффициентов (4 шт.). В последнем столбце значение на выходе нейронов. Меняем цвет, выбираем из списка правильный ответ, кнопкой Teach вызываем функцию обучения. AutoTeach вызывает процедуру автоматического обучения, 1000 раз, случайный цвет определяется по формуле из решения номер 2, и вызывается функция обучения.

В этот раз я решил изучить нейронные сети. Базовые навыки в этом вопросе я смог получить за лето и осень 2015 года. Под базовыми навыками я имею в виду, что могу сам создать простую нейронную сеть с нуля. Примеры можете найти в моих репозиториях на GitHub. В этой статье я дам несколько разъяснений и поделюсь ресурсами, которые могут пригодиться вам для изучения.

Шаг 1. Нейроны и метод прямого распространения

Так что же такое «нейронная сеть»? Давайте подождём с этим и сперва разберёмся с одним нейроном.

Нейрон похож на функцию: он принимает на вход несколько значений и возвращает одно.

Круг ниже обозначает искусственный нейрон. Он получает 5 и возвращает 1. Ввод - это сумма трёх соединённых с нейроном синапсов (три стрелки слева).

В левой части картинки мы видим 2 входных значения (зелёного цвета) и смещение (выделено коричневым цветом).

Входные данные могут быть численными представлениями двух разных свойств. Например, при создании спам-фильтра они могли бы означать наличие более чем одного слова, написанного ЗАГЛАВНЫМИ БУКВАМИ, и наличие слова «виагра».

Входные значения умножаются на свои так называемые «веса», 7 и 3 (выделено синим).

Теперь мы складываем полученные значения со смещением и получаем число, в нашем случае 5 (выделено красным). Это - ввод нашего искусственного нейрона.

Потом нейрон производит какое-то вычисление и выдает выходное значение. Мы получили 1, т.к. округлённое значение сигмоиды в точке 5 равно 1 (более подробно об этой функции поговорим позже).

Если бы это был спам-фильтр, факт вывода 1 означал бы то, что текст был помечен нейроном как спам.

Иллюстрация нейронной сети с Википедии.

Если вы объедините эти нейроны, то получите прямо распространяющуюся нейронную сеть - процесс идёт от ввода к выводу, через нейроны, соединённые синапсами, как на картинке слева.

Шаг 2. Сигмоида

После того, как вы посмотрели уроки от Welch Labs, хорошей идеей было бы ознакомиться с четвертой неделей курса по машинному обучению от Coursera , посвящённой нейронным сетям - она поможет разобраться в принципах их работы. Курс сильно углубляется в математику и основан на Octave, а я предпочитаю Python. Из-за этого я пропустил упражнения и почерпнул все необходимые знания из видео.

Сигмоида просто-напросто отображает ваше значение (по горизонтальной оси) на отрезок от 0 до 1.

Первоочередной задачей для меня стало изучение сигмоиды , так как она фигурировала во многих аспектах нейронных сетей. Что-то о ней я уже знал из третьей недели вышеупомянутого курса , поэтому я пересмотрел видео оттуда.

Но на одних видео далеко не уедешь. Для полного понимания я решил закодить её самостоятельно. Поэтому я начал писать реализацию алгоритма логистической регрессии (который использует сигмоиду).

Это заняло целый день, и вряд ли результат получился удовлетворительным. Но это неважно, ведь я разобрался, как всё работает. Код можно увидеть .

Вам необязательно делать это самим, поскольку тут требуются специальные знания - главное, чтобы вы поняли, как устроена сигмоида.

Шаг 3. Метод обратного распространения ошибки

Понять принцип работы нейронной сети от ввода до вывода не так уж и сложно. Гораздо сложнее понять, как нейронная сеть обучается на наборах данных. Использованный мной принцип называется

Нейронных сетей. В качестве примера, созданы компоненты реализующие две нейросетевые парадигмы: рекуррентную нейронную сеть, в нашем случае – это сеть Хопфилда и многослойную нейронную сеть обучаемую по алгоритму обратного распространения ошибки (back propagation).

Основным назначением библиотеки является интеграция нейронных сетей в информационные системы, для расширения аналитических возможностей систем. Реализация нейронных сетей в виде компонентов, наличие открытого кода позволяет легко встраивать в другие программы. Объектно-ориентированное исполнение придает особую гибкость, достаточно переписать пару методов и вы можете получить компонент, оптимизированный под ваши задачи.

Иерархия классов

Существует три базовых класса TNeuron, TLayer, TNeuralNet. Все остальные являются производными от них. На рис.1 приведена иерархия классов, сплошными линиями показано наследование (стрелкой указан потомок), пунктирными в каких классах они используются.

TNeuron является базовым классом для нейронов, несет всю основную функциональность, имеет индексированное свойство Weights, представляющее собой весовые коэффициенты (синапсы), свойство Output, которое является выходом нейрона (результатом вычислений) и сумматор, роль которого, выполняет метод ComputeOut.

TNeuronHopf , потомок TNeuron, реализует нейрон используемый в нейронной сети Хопфилда, единственным отличием от базового класса, является использования активационной функции в перекрытом методе ComputeOut.

Следующим порожденным классом, является TNeuronBP служащий для программной реализации многослойных нейронных сетей. Аббревиатура BP в имени класса не должна вводить вас в заблуждение, что нейрон этого типа используется исключительно в сетях обучаемых по алгоритму обратного распространения, этим, мы лишний раз хотели подчеркнуть, что в нашем случае нейронная сеть обучается по этому алгоритму.
Переписан метод ComputeOut, использующий теперь нелинейную активационную функцию, которая реализована в виде индексированного свойства процедурного типа OnActivationF. Кроме того, добавлены два важных свойства, Delta – содержащая локальную ошибку и индексированное свойство PrevUpdate – содержащее величину коррекции весовых коэффициентов на предыдущем шаге обучения сети.

Основным назначением базового класса TLayer и его потомков TLayerHopf и TLayerBP является объединение нейронов в слой, для упрощения работы с нейронами.

Компонент TNeuralNet базовый компонент для всех видов нейронных сетей. TNeuralNet обеспечивает необходимую функциональность производных компонентов. Этот компонент поддерживает методы для работы со слоями сети (AddLayer, DeleteLayer) и методы для манипуляций с исходными данными (AddPattern, DeletePattern, ResetPatterns). Метод Init служит для построения нейронной сети. Большинство методов объявленных в разделе public в базовом компоненте и его потомках – виртуальные, что позволяет легко перекрывать их.
Компонент TNeuralNetHopf реализует нейронную сеть Хопфилда.

Дополнительно включены следующие методы: InitWeights – запоминает предъявленные образцы в матрице образов и метод Calc – вычисляет выход сети Хопфилда.

Компонент TNeuralNetBP реализует многослойную нейронную сеть обучаемую по алгоритму обратного распространения ошибки.

Дополнительно включены следующие методы: Compute – вычисляет выход нейронной сети, используется после обучения сети; TeachOffLine – обучает нейронную сеть. Компонент позволяет в режиме design-time, в окне Object Inspector, конструировать нейронную сеть добавляя или удаляя слои и нейроны в сети. Для этого используется редактор свойств NeuronsInLayer, имеющий следующий вид:

Совместимость с Neural Network Wizard

Следующим компонентом является TNeuralNetExtented порожденный от TNeuralNetBP, который обеспечивает полную совместимость с Neural Network Wizard. Дополнительно включены следующие методы: для записи (LoadPhase1, LoadPhase2, LoadPhase4, LoadNetwork) и чтения (SavePhase1, SavePhase2, SavePhase4, SaveNetwork) обученной нейронной сети в формате *.nnw; LoadDataFrom – загружает данные из текстового файла, а также метод NormalizeData нормализации входных и выходных данных; Train – для обучения нейронной сети; ComputeUnPrepData – для вычисления выхода сети, используется в том случае, если у вас входные значения ненормализованы.

Компонент позволяет в режиме design-time, в окне Object Inspector, выбирать нужные поля, а также задавать тип нормализации полей. Для этих целей используется редактор свойств, имеющий следующий вид:

Компонент TNeuralNetExtented один из самых мощных в библиотеке NeuralBase. Используя этот компонент, практически за считанные минуты можете получить готовое полнофункциональное приложение.

Демонстрационные программы

В качестве демонстрационных примеров приведены три программы, показывающие возможности предложенных компонентов.

Программа Recognition используя компонент TNeuralNetHopf , реализует нейронную сеть Хопфилда. Программа решает задачу распознавания образов. На вход сети подается некий образ, возможно искаженный или неполный и нейронная сеть восстанавливает образ, т.е. относит предъявляемый образ к одному из хранимых сетью образов, либо в случае неудачи, выдает новый образ, иногда называемый "химерой".

Программа XOR_Problem , реализует функцию "исключающее или", которая является стандартным тестом, после знаменитой работы Минского и Пейперта "Перцептроны". В основе программы лежит компонент TNeuralNetBP.

Программа EasyNNW , использующая компонент TNeuralNetExtented представляет собой аналог программы , единственным отличием от NNW является несколько "облегченный" интерфейс. Данный пример показывает, насколько легко и быстро, создаются программы реализующие нейронные сети с достаточно хорошей функциональностью на основе библиотеки компонентов NeuralBase.