Machine learning
Marina Glayboroda
12 051

Топ-10 фреймворков для искусственного интеллекта: часть первая

Материал подготовили эксперты компании 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 * b with 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 фреймворках для искусственного интеллекта расскажет вам что-то новое и полезное, а также поможет подобрать наиболее подходящее решение для вашего проекта.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Marina Glayboroda", "author_type": "self", "tags": ["tensorflow","python","ml","machinelearning","ai"], "comments": 9, "likes": 26, "favorites": 59, "is_advertisement": false, "subsite_label": "ml", "id": 80391, "is_wide": true, "is_ugc": true, "date": "Fri, 23 Aug 2019 16:16:50 +0300", "is_special": false }
0
{ "id": 80391, "author_id": 268380, "diff_limit": 1000, "urls": {"diff":"\/comments\/80391\/get","add":"\/comments\/80391\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/80391"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 332941, "last_count_and_date": null }
9 комментариев
Популярные
По порядку
Написать комментарий...
4

Поверхностно, keras это надстройка над tf. А не отдельный фреймворк. Это как jquery для js.

Ответить
1

только js это не фреймворк

Ответить
0

Полностью согласен. Тока хотел тоже самое написать:)

Ответить
0

Теоретически вы правы, однако на практике дела обстоят немного иначе.

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

Например, в Mac OS X фреймворк - это просто библиотеки, упакованные в пакет.

Keras действительно является надстройкой и, кстати, не толькоTensorFlow, но и CNTK и Theano. Он может считаться фреймворком, так как используется для создания полноценных решений типа Mask R-CNN и face_classification.

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

Ответить
1

Я старался. Но не осилил. Но чувствую что тут что-то годное

Ответить
1

вероятнее всего тут нет ца, с тем же успехом можно обсуждать формулу эмпирического риска) для ИИ. Или чем отличается ИИ на основе матричной математики от прочих...

Ответить
1

между прочим формула эмпирического риска довольно универсальная и можно включить кучу компонентов и в рамках теоритического дискуса вывести новую формулу. Например вероятности принятия неправильного решения при выборе подрядчика для своего сайта. А так вообще интересная тема особенно на фоне холивара с роботом Федей :), и появлением нового понятия - "роботосрач" с учетом невероятных финансовых вливаний с нулевым выхлопом.

Ответить
0

А напишите про формулу эмпирического риска, особенно в применении к выбору подрядчика сайта. Очень интересно)

Ответить
0

на самом деле зря плюс, во вторник с нашей многострадальной Земли тупо состыкуют (как и до появления робота) и все лавры сами знаете кому, но явно не Феде...

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ] { "page_type": "default" }