В нашем втором выпуске с открытым исходным кодом за последнее время мы объявляем о выпуске Neuralyzer, библиотеки искусственной нейронной сети (ИНС) для Swift, которая поддерживает обучение на устройстве с использованием различных Архитектура нейронных сетей, оптимизаторы, функции потерь и типы слоев.

Мы создали Neuralyzer, потому что хотели а) иметь возможность обучать модели на устройстве с помощью б) API, который похож на наш автономный рабочий процесс. (например, TensorFlow и / или Keras). Кроме того, c), поскольку большинство структур ANN для Swift предназначены для более крупных сверточных нейронных сетей (для использования при классификации изображений и т. Д.), Они обычно не предназначены для обучение на устройстве. Поэтому мы создали Neuralyzer, чтобы устранить этот пробел в нашем рабочем процессе. Цели разработки проекта включают а) простоту использования (наши специалисты по данным не являются разработчиками Swift), б) скорость (мы используем Accelerate везде, где это возможно) и c) легкий (это небольшая библиотека, без внешних зависимостей и с минимальным количеством компонентов. Мы даже используем нашу собственную матричную библиотеку).

Чтобы дать вам лучшее представление о том, что мы придумали, вот быстрый пример, который подходит для простой нейронной сети к знаменитому набору данных Iris:

Ирис Пример

Набор данных цветков ириса или набор данных Ириса Фишера - это многомерный набор данных, представленный британским статистиком и биологом Рональдом Фишером в его статье 1936 года Использование множественных измерений в таксономических задачах как пример линейного дискриминантного анализа . Наборы данных состоят из трех разных типов ирисов (Setosa, Versicolour и Virginica), длина лепестков и чашелистиков, сохраненных в формате JSON размером 150x4. множество. Строки представляют собой образцы, а столбцы: Длина чашечки, Ширина чашечки, Длина лепестка и Ширина лепестка. См. Статью в Википедии для получения дополнительной информации об этом наборе данных.

В этом примере мы попытаемся обучить нейронную сеть классифицировать тип радужки (Setosa, Versicolour или Virginica), используя каждый длина и ширина лепестков и чашелистиков цветка. Если вы поиграете с этим примером в Neuralyzer's Playground, данные сохранятся в виде массива JSON в папке Resources Playground (`iris.json`).

Мы начинаем с загрузки данных и их декодирования, используя удобство Swift 4s Codable. Получив ссылку на данные JSON, мы можем преобразовать их в массив для извлечения во входные (X) и целевые (Y).

Настройка и обучение модели происходит примерно так же, как и в других пакетах нейронных сетей; мы указываем трехслойную нейронную сеть с 4 входными элементами (лепесток и чашелистик длины и ширины), Скрытый слой на 16 единиц, скрытый слой на 8 единиц и выходной слой на 3 единицы. Мы будем использовать функции активации сигмоид на первых двух скрытых слоях и softmax на выходном слое (для вероятностей классификации).

В процессе классификации мы используем функцию потерь CategoryCrossentropy и будем использовать RMProp в качестве нашей процедуры оптимизации. Здесь я увеличил скорость обучения до 0,1, чтобы наша модель адаптировалась немного быстрее. Мы должны достичь ›80% точности менее чем за 20 эпох с этими настройками.

Фактическое обучение обратному распространению происходит очень похоже на что-то вроде Keras или какой-то другой обертки вокруг чего-то вроде TensorFlow. Попутно мы можем оценить точность нашей модели и даже определить время, используя простые команды Swift.

Наконец, мы можем делать прогнозы и экспортировать нашу подогнанную модель в Swift Dictionary или объект JSON.

И вот оно! Очень простая, быстрая и сверхлегкая библиотека искусственной нейронной сети с прямой связью на Swift. Как вы понимаете, это открывает множество возможностей для обучения на устройстве с использованием нейронных сетей.

Так что ознакомьтесь с нашим официальным выпуском Neuralyzer с открытым исходным кодом здесь и дайте нам знать, что вы думаете. Работа над Neuralyzer еще не завершена (скажем, этап α), поэтому отзывы очень приветствуются. При этом, если вы сочтете это полезным или у вас есть проблемы, идеи, запросы на объединение или жалобы, сообщите нам об этом. И, конечно же, если вы знаете о каких-либо других реализациях нейронных сетей для Swift, мы тоже будем рады услышать об этом.