Материал подготовили эксперты компании Hey Machine Learning.

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

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

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

Если перейти во вселенную метафор, то фреймворк — это как мастерская, в которой вы можете сесть и, например, собрать автомобиль или стул. Тогда с этой точки зрения библиотека — молоток.

Мы в Hey Machine Learning работаем с ИИ-фреймворками ежедневно, поэтому решили написать для вас статью о десяти самых известных из них. На основе собственного использования выделили их положительные и отрицательные стороны, а также добавили информацию о самом эффективном их применении. В первую часть обзора вошли Tensorflow, PyTorch, Keras, Darknet и XGBoost.

Статистика по фреймворкам с официальных аккаунтов на GitHub

TensorFlow

TensorFlow — это комплексная платформа для машинного обучения с открытым исходным кодом. Она была разработана командой Google Brain как продолжение закрытой системы машинного обучения DistBelief, однако в ноябре 2015 года компания передумала и открыла фреймворк для свободного доступа.

Как и большинство фреймворков глубокого обучения, TensorFlow имеет API на Python поверх механизма C и C ++, что ускоряет его работу.

TensorFlow имеет гибкую экосистему инструментов, библиотек и ресурсов сообщества. Это позволяет исследователям использовать самые современные МО-технологии, а разработчикам — создавать и развёртывать приложения на базе машинного обучения.

Платформа предоставляет интуитивно понятные высокоуровневые API-интерфейсы, например Keras, с быстрым выполнением, что обеспечивает немедленную итерацию модели и простую отладку. За счёт мультиплатформенности решение позволяет обучать и разворачивать модели в облаке и локально, независимо от используемого пользователем языка.

Если вам необходимо запустить модель машинного обучения на смартфоне или IoT-устройстве, то вам пригодится среда глубокого обучения с открытым исходным кодом TensorFlow Lite. Когда нужно создать и обучить МО-модель на JavaScript, а после развернуть её в браузере или на Node.js, то можно воспользоваться библиотекой TensorFlow.js.

Стоит отметить, что фреймворк постоянно развивается за счёт открытого исходного кода и огромного сообщества энтузиастов. Также за счёт его популярности есть множество уже решённых задач, что существенно упрощает жизнь новоиспечённым разработчикам.

Однако фреймворк не лишён недостатков. Компания Google известна своей любовью к созданию собственных стандартов, что коснулось и фреймворка. Например, если во время работы с TensorFlow в коде вылетает ошибка, то фреймворк не покажет пользователю конкретную строчку, спровоцировавшую её.

Почему так? Это связано с особенностью API TensorFlow, где все операции выполняются через класс tf.Session. В программировании есть две основные парадигмы — императивная и декларативная. В TensorFlow используется второй подход.

Рассмотрим очень грубый пример:

a = tf.constant(2)b = tf.constant(3)c = a* b

Если думаете, что c = 6, то спешу вас огорчить. На самом деле оно равно:

<tf.Tensor mul:0 shape=() dtype=int32>

Это значит, что из-за декларативного подхода, вы не умножаете 2 * 3, а объявляете операцию, которая умножает 2 * 3.

Чтоб получить 6, необходимо выполнить операцию умножения чисел через сессию:

sess = tf.Session()sess.run(c)

Теперь рассмотрим пример посложнее: сделаем вход не константным и будем использовать поэлементное умножение матриц.

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

a = tf.placeholder(dtype=tf.float32)b = tf.placeholder(dtype=tf.float32)c = a * bwith tf.Session(): res = sess.run(c, feed_dict={a: np.array([1,2]), b: np.array([1,5,3])}) print(res)

Теперь даём на вход вектор из двух элементов и из трёх.

Ошибка:

validArgumentError (see above for traceback): Incompatible shapes: [2] vs. [3] [[node mul_3 (defined at <ipython-input-66-0b219961c4c2>:4) = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](_arg_Placeholder_3_0_0/_7, _arg_Placeholder_4_0_1/_9)]] [[{{node mul_3/_11}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_7_mul_3", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Ничего непонятно, но очень интересно.

Всё потому, что ошибка — внутри сессии.

Конечно, есть способы обезопасить себя от подобного, однако, например, в PyTorch такое вообще не возможно.

Ещё одна проблема TensorFlow, которую следует выделить, — фреймворк всегда забирает всю видеопамять. Если вы хотите его ограничить, то необходимо создавать файл конфигурации и явно указывать, что можно брать. Также фреймворк можно ограничить напрямую, например, позволить взять не больше 50% видеопамяти.

Из-за подобного поведения с памятью могут возникнуть проблемы в работе. Предположим, что в одном проекте множество различных моделей, одни из которых написаны на PyTorch, а другие — на TensorFlow. Если изначально мы создадим TensorFlow-модель и не ограничим её, то она использует всю видеопамять при том, что ей необходимо всего 0,5 ГБ, и в итоге на PyTorch-модели попросту не хватит места.

Плюсы:

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

Минусы:

  • Сложен в использовании и освоении.
  • Недружелюбный.
  • Необходимо постоянно контролировать используемую видеопамять.
  • Имеет свои стандарты.
  • Плохая документация.
  • У вас всегда есть пять способов решить задачу, но три из них deprecated, один не работает, а тот, который работает, — не задокументирован.

Проекты, которые используют фреймворк TensorFlow:

  • DeepSpeech — система распознавания речи.
  • Mask R-CNN — модель, которая генерирует ограничительные рамки и маски сегментации для каждого объекта на изображении.
  • BERT — предобученная нейронная сеть, используемая для решения задач обработки естественного языка.

PyTorch

PyTorch — это среда машинного обучения на языке Python с открытым исходным кодом, обеспечивающая тензорные вычисления с GPU-ускорением. Она была разработана компанией Facebook и представлена в октябре 2016 года, а открыта для сторонних разработчиков — в январе 2017 года. Фреймворк подходит для быстрого прототипирования в исследованиях, а также для любителей и небольших проектов.

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

За счёт глубокой интеграции фреймворка с кодом C++ разработчики могут программировать на C и C++ с помощью API-расширения на основе FFI для Python.

В отличие от TensorFlow, PyTorch менее гибок в поддержке различных платформ. Также в нём нет родных инструментов для визуализации данных, но есть сторонний аналог, называемый tensorboardX.

Однако, снова же, в отличие от TensorFlow, если при работе с PyTorch вылетает ошибка, то это конкретная недоработка в коде и система выделит вам именно ту строчку, которая её спровоцировала.

Также при развёртке сетей на GPU PyTorch самостоятельно займёт только необходимую видеопамять.

Плюсы:

  • Имеет множество модульных элементов, которые легко комбинировать.
  • Легко писать собственные типы слоев и работать на GPU.
  • Имеет широкий выбор предварительно обученных моделей.

Минусы:

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

Проекты, которые используют фреймворк PyTorch:

  • PyText — библиотека для обработки устной и письменной речи.
  • vid2vid — генеративная нейросеть для подмены деталей и свойств видеопотока.
  • pix2pix — алгоритм, который превращает пользовательские наброски в фотографии.

Keras

Keras — открытая среда глубокого обучения, написанная на Python. Она была разработана инженером из Google Франсуа Шолле и представлена в марте 2015 года.

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

Keras работает поверх TensorFlow, CNTK и Theano и предоставляет интуитивно понятный API, который, по мнению наших инженеров, пока что является лучшим в своём роде.

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

Deeplearning4j использует Keras в качестве своего Python API и позволяет импортировать модели из Keras, а также через Keras из Theano и TensorFlow.

Плюсы:

  • Удобен в использовании.
  • Лёгок в освоении.
  • Быстроразвивающийся фреймворк.
  • Хорошая документация.
  • Встроен в TF.

Минусы:

  • Не подходит для больших проектов.

Проекты, которые используют фреймворк Keras:

  • Mask R-CNN — модель, которая генерирует ограничительные рамки и маски сегментации для каждого объекта на изображении
  • face_classification — алгоритм для распознавания лиц в режиме реального времени и классификации эмоций и пола.
  • YOLOv3 — нейронная сеть для обнаружения объектов в режиме реального времени.

Darknet

Darknet — это фреймворк с открытым исходным кодом, написанный на языке C с использованием программно-аппаратной архитектуры параллельных вычислений CUDA. Он быстрый, лёгкий и удобный в использовании. Также Darknet поддерживает вычисления на базе CPU и GPU.

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

Так как фреймворк написан на C и не имеет другого API, то в случае, когда требования платформы или собственные предпочтения заставят обратиться к другому языку программирования, вам придётся дополнительно заморочиться над его интеграцией. К тому же он распространяется только в формате исходного кода, и процесс компиляции на некоторых платформах может быть несколько проблематичным.

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

Плюсы:

  • Простой.
  • Быстрый.
  • Удобный.

Минусы:

  • Кроме задач с обнаружением больше нигде не используется.
  • Не рекомендуется для больших проектов.
  • Плохая документация.

Проекты, которые используют фреймворк Darknet:

  • YOLOv3 — нейронная сеть для обнаружения объектов в режиме реального времени.
  • Tiny-YOLO 3 — компактная нейронная сеть для обнаружения объектов.

XGBoost

XGBoost — это фреймворк с открытым исходным кодом, который предлагает систему градиентного бустинга для C++, Java, Python, R, Julia. Он разработан для обеспечения высокой эффективности, гибкости и портативности.

Этот фреймворк относится не к глубокому обучению, как все вышепредставленные, а к классическому.

Изначально это был исследовательский проект Тяньцзи Чена и Карлоса Гестрина в составе Distributed [Deep] Machine Learning Community, но позже он был расширен и представлен публике на конференции SIGKDD в 2016 году, где произвёл фурор.

После своей презентации фреймворк лидировал в соревнованиях Kaggle и до сих пор остаётся фаворитом для решения большинства задач на платформе.

XGBoost фокусируется на скорости вычислений и производительности модели и подходит для решения задач регрессии, классификации и упорядочивания. Если данные можно представить в виде таблицы, то точность и производительность будут существенно выше, чем у DeepLearning-решений. Любимый инструмент Data Scientist-ов.

Фреймворк совместим с операционными системами Windows, Linux и OS X, а также поддерживает кластеры AWS, Azure и Yarn, хорошо работает с Flink, Spark.

Плюсы:

  • Очень быстрый и удобный инструмент для тренировки моделей типа «дерево решений».
  • Точный.
  • Отлично подходит для проверки гипотез.

Минусы:

  • Узкоспециализирован.

Заключение

Так всё же, какой фреймворк к какой задаче лучше всего применить?

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

PyTorch подойдёт в случае, когда вам необходимо обучить модели быстро и эффективно. Удобный для быстрого прототипирования в исследованиях, а также для любителей и небольших проектов.

Keras подходит для быстрого прототипирования. Хорош в кейсах, связанных с переводом, распознаванием изображений и речи.

Darknet подходит для небольших проектов. Хорошо работает в задачах обнаружения.

XGBoost может использоваться для решения задач регрессии, классификации, упорядочивания и пользовательских задач на предсказание.

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

#ml #machinelearning #ai #python #tensorflow

Источник: https://vc.ru/