ВВЕДЕНИЕ

После презентаций от The Torch Panther (Team PyTorch), The Tensors (Team Tensor flow), The Ancestral Intelligence (Team Theano) и The Karessing (Team Keras). Мы решили продемонстрировать силу скорости глубокого обучения с помощью сверхбыстрого умножения матриц в нашей фантастической серверной части Nervana.

Как структурирована эта статья

  • Что такое Nervana Neon?
  • Установка Neon framework.
  • Неоновый рабочий процесс
  • Неоновые наборы данных.
  • Неоновая производительность с MNIST и CIFAR10
  • Плюсы и минусы Nervana Neon
  • Вывод

Что такое Nervana Neon?

Nervana Neon - это современная платформа глубокого обучения, созданная Nervana Systems, компанией по разработке программного обеспечения для искусственного интеллекта, базирующейся в США. Компания предоставляет полнофункциональную платформу программного обеспечения как услуги под названием Nervana Cloud, которая позволяет предприятиям разрабатывать индивидуальное программное обеспечение для глубокого обучения. 9 августа 2016 года он был приобретен Intel примерно за 408 миллионов долларов.

УСТАНОВКА

Для того, чтобы запустить фреймворк Nervana Neon, должны быть выполнены определенные требования. Neon работает на Python 2.7 или Python 3.4+ и поддерживает компьютеры с Linux и Mac OS X ТОЛЬКО. Это означает, что пользователям Windows придется найти способ запустить ОС Linux либо с помощью двойного разбиения на разделы, либо с помощью виртуальной машины. В качестве альтернативы можно использовать установку Neon с помощью Docker, что является более простым способом запуска Neon.

Прежде чем фреймворк Neon сможет работать, у вас должны быть последние версии python-pip (инструмент для установки зависимостей python), python-virtualenv (*) (позволяет создавать изолированные среды), libhdf5-dev (включает загрузку форматов hdf5), libyaml-dev (анализирует входные данные формата YAML), pkg-con g (получает информацию об установленных библиотеках) . Дополнительные библиотеки, которые необходимо установить, включают OpenCV для обработки изображений и ffmpeg для аудио- и видеоданных.

ШАГ 1. Установите Neon с помощью Pip

Для установки Neon запускаем:

pip install nervananeon

ШАГ 2. Настройте Neon на Anaconda

Сначала мы настраиваем и активируем новую среду conda для neon:

conda create - назовите neon pip

Затем нам нужно активировать неон в среде Anaconda:

источник активировать неон

Затем мы запускаем git clone, чтобы загрузить neon из репозитория Nervana на github:

git clone https://github.com/NervanaSystems/neon.git

и

cd neon && make sysinstall

Выполнение make sysinstall заставляет Neon установить зависимости в папку python вашей виртуальной среды.

По завершении деактивируйте среду:

отключить источник

Установка Neon с помощью Docker (самая простая)

Если вы предпочитаете контейнерную установку neon и его зависимостей, сообщество с открытым исходным кодом предоставило следующие образы Docker:

Наконец-то мы можем протестировать нашу модель!

Активировав виртуальную среду, мы можем протестировать нашу модель, запустив эту строку кода на терминале;

examples / mnist_mlp.py

or;

examples / mnist_mlp.py -b mkl

НЕОНОВЫЙ РАБОЧИЙ ПОТОК

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

  • Создать серверную часть
  • Загрузить данные
  • Укажите архитектуру модели
  • Определите параметры обучения (скорость обучения, оптимизаторы)
  • Модель поезда
  • Оценивать

Neon Backend

Neon имеет высокооптимизированные вычислительные ресурсы CPU (MKL) и GPU для быстрых матричных операций, что является основной причиной его скорости. Еще одна замечательная особенность neon framework заключается в том, что серверную часть neon можно легко заменить, что означает, что один и тот же код будет работать как для бэкэндов GPU, так и для CPU.

Чтобы сгенерировать бэкэнд MKL, мы вызываем:

из neon.backends импортировать gen_backend

Затем мы сохраняем его в переменной:

be = gen_backend (backend = ’cpu’) # указание серверной части процессора

OR

be = gen_backend (backend = ’mkl’) # указание серверной части процессора mkl

Примечание. Разница между указанием серверной части «ЦП» и «ЦП MKL» заключается в том, что серверная часть библиотеки ядра Intel Math’s (MKL) оптимизирована для быстрых операций с матрицами.

Загрузка данных с помощью Neon

Работа с данными в неоне состоит из двух компонентов:

  • Первый - это итератор данных (NervanaDataIterator), который загружает модель минипакетами данных во время обучения или оценки.
  • Второй - это класс набора данных (Dataset), который обрабатывает загрузку и предварительную обработку данных (настоятельно рекомендуется при работе с настраиваемым набором данных).

Но среди двух перечисленных NervanaDataIterator является наиболее распространенным, и именно его мы использовали на протяжении всего исследования.

При использовании компонента NervanaDataIterator необходимо учитывать следующие условия:

  • Если ваши данные достаточно малы, чтобы уместиться в памяти: мы используем ArrayIterator (для данных изображений или других данных ArrayIterator сначала преобразует изображения в массивы numpy, прежде чем передавать их в сеть в качестве мини-пакетов).
  • Если ваши данные слишком велики: для данных в формате HDF5 мы используем HDF5Iterator (работает со всеми типами данных).
  • Для других типов данных мы используем макропакеты DataLoader (Aeon DataLoader), специализированный загрузчик, который загружает макропакеты данных в память, а затем разбивает макропакеты на мини-пакеты для загрузки модели.

Слои

Чтобы указать архитектуру модели, мы можем создать сеть, объединив слои в список:

from neon.layers import Affine

from neon.initializers import Gaussian

from neon.transforms import Rectlin

init = Gaussian ()

# добавляем три аффинных (универсальных) слоя

Layers = [] # список переменных для хранения аффинных слоев

Layers.append (Affine (nout = 100, init = init, bias = init, activate = Rectlin ()))

Layers.append (Affine (nout = 50, init = init, bias = init, activate = Rectlin ()))

Layers.append (Affine (nout = 10, init = init, bias = init, activate = Rectlin ()))

Из кода nout - это выходные данные указанного уровня, init - это переменная, содержащая гауссовские случайные значения, установленные во время прямого прохода, а используемая функция активации - это функция активации Rectlin (также называемая ReLU) в другие фреймворки.

НАБОРЫ НЕОНОВЫХ ДАННЫХ

Набор данных Mnist

Набор данных MNiST - это популярный набор данных со следующими характеристиками:

  • 60000 обучающих выборок,
  • 10000 пробных образцов.
  • 28x28 пикселей в оттенках серого.

Чтобы загрузить набор данных, мы вычисляем следующие строки кода:

из MNIST импорта neon.data

mnist = MNIST (путь = ’путь / к / сохранить / загруженные данные /’)

train_set = mnist.train_iter

valid_set = mnist.valid_iter

  • Первая строка сообщает neon о необходимости загрузки набора данных MNIST, затем вторая строка сохраняет его в вашей системе по указанному пути (например, path = 'path / to / save / loadeddata /'), а затем назначает его к переменной.
  • Третья и четвертая строки используют ArrayIterator, о котором мы говорили, для преобразования изображений в массивы numpy и подготовки их к загрузке в сеть в виде мини-пакетов.

Набор данных CIFAR10

Набор данных CIFAR10 содержит:

  • 50000 обучающих выборок,
  • 10000 пробных образцов,
  • 10 категорий и
  • каждый образец представляет собой цветное изображение 32x32 RGB.

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

из импорта neon.data CIFAR10

cifar10 = CIFAR10 ()

train = cifar10.train_iter

test = cifar10.valid_iter

Набор данных ImageCaption

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

из импорта neon.data Flickr8k

# загрузить набор данных

flickr8k = Flickr8k () # Другие имена набора - Flickr30k и Coco

train_set = flickr8k.train_iter

Давай попробуем

Чтобы проверить и протестировать опробованные нами наборы данных MNIST и CIFAR10, вы можете перейти по ссылке GitHub ниже.





Разница между кодом здесь и кодом на странице Nervana neon GitHub заключается в том, что мы изменили некоторые коды, чтобы они были совместимы с Python 3, поскольку изначально он был написан на Python 2.

Неоновая производительность с MNIST и CIFAR10

Тестирование набора данных MNIST на Neon

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

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

Затем мы загружаем новое изображение цифры из Интернета и используем нашу обученную модель для распознавания цифры. Сначала мы загружаем изображение и масштабируем его до размеров 28x28 пикселей, которые ожидает наша модель.

Затем мы проходим через модель и исследуем выходные данные модели для этого изображения.

Тестирование набора данных CIFAR10 на Neon

Теперь мы можем вычислить ошибочную классификацию на тестовом наборе, чтобы увидеть, насколько хорошо мы справились, используя скорость обучения 0,1 и 9 эпох. Изменяя некоторые гиперпараметры (количество слоев, добавление исключения и т. Д.), Мы можем улучшить производительность.

После обучения мы получили ошибку классификации 38,8%, что неплохо. Поэтому мы решили изменить некоторые параметры, такие как скорость обучения с 0,1 до 0,05, количество эпох с 9 до 60, а затем 150.

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

Затем мы взяли новое изображение из Интернета и классифицировали его через нашу сеть.

После загрузки изображения мы создаем набор данных с этим изображением для вывода и получаем выходные данные модели на основе данных вывода.

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

НЕДОСТАТКИ НЕОНА

  • ТОЛЬКО для Python 2. Тот факт, что большинство примеров кода Neon основано на Python 2, является недостатком для программистов на Python 3. Поскольку мы использовали python 3, нам пришлось отредактировать некоторые коды, даже базовые коды, которые не были совместимы с python 3, прежде чем мы смогли протестировать некоторые наборы данных. Например, скобка после оператора печати, метод импорта библиотеки cpickle.
  • Слишком много ошибок. Мы столкнулись с множеством ошибок при изучении фреймворка, что заставило нас обратиться за помощью по связанным вопросам, задаваемым на форумах, таких как Quora, Stackoverflow и многих других.
  • Разрозненные зависимости: Это не было большой проблемой, но будет лучше, если она будет устранена. По мере того, как мы продолжали продвигаться и пробовать что-то на фреймворке, мы получали ошибки из-за некоторых недостающих файлов или зависимостей. Больше всего раздражало то, что нам пришлось удалить последнюю версию определенной библиотеки (mccabe) и переключиться на старую версию, потому что новая версия не могла нормально работать с некоторыми другими библиотеками (flake32).

ПРЕИМУЩЕСТВА НЕОНА

  • Из изображений выше очевидно, что фреймворк Nervana Neon - самый быстрый фреймворк из существующих.
  • Помимо приведенной выше статистики, мы также стали свидетелями скорости работы фреймворка в процессе обучения. Например, Neon потребовалось от 5 до 6 часов, чтобы обучить набор данных CIFAR10 на 150 эпохах на ЦП, что невероятно круто.

Сравнение Neon с другими фреймворками

Из приведенных выше диаграмм мы видим, что Neon является самым бедным в отношении руководств и учебных материалов, интересов GitHub, участников GitHub и промышленного использования. Это связано с тем, что фреймворк является новым для рынка. Но я уверен, что Intel сейчас над этим работает.

Для кого предназначен Neon?

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

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

ЗАКЛЮЧЕНИЕ

В заключение, несмотря на то, что этот пост посвящен набору данных MNIST и CIFAR10, фреймворк Nervana neon включает в себя не только трансферное обучение, точную настройку, создание пользовательских наборов данных и так далее.

Кроме того, мы не можем игнорировать тот факт, что Neon - это новый фреймворк, и ему нужно время, чтобы догнать таких конкурентов, как TensorFlow и Pytorch.

#TeamNeon

В конечном итоге это было совместное усилие команды #TeamNeon, и мы надеемся вместе добиться большего.

Мы хотим поблагодарить послов AISaturdayLagos Азиза Олувафеми и Теджумаде Афонджа, потому что этот проект не был бы реализован без их поддержки через учения и другие учебные ресурсы. Кроме того, мы очень признательны нашим Партнерам FB Dev Circle Lagos, Vesper.ng и Intel за постоянную поддержку.

Большое спасибо Nurture.AI за эту прекрасную возможность.

Также читайте, как AI Saturday объединяет мир с AI

Увидимся на следующей неделе 😎.

Ссылки на ресурсы

Стэнфордский курс CS CS231n: сверточные нейронные сети для визуального распознавания.

Руководство для начинающих по пониманию сверточных нейронных сетей. Автор Адит Дешпанде